How to Validate Array Data in Laravel Using Request Classes
Tags: laravel, validation
Published: 2024-07-05 09:13:40


1. Create a Request Class:

As before, create a request class with your validation rules.

```
php artisan make:request StoreUserRequest
```

Define your validation rules in the generated request class (StoreUserRequest):

```
<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class StoreUserRequest extends FormRequest
{
    public function authorize()
    {
        return true;
    }

    public function rules()
    {
        return [
            'name' => 'required|string|max:255',
            'email' => 'required|email|unique:users,email',
            'password' => 'required|string|min:8',
        ];
    }
}
```

2. Validate the Array Data in the Controller:

In your controller, you can validate the array data using the validation rules from the request class and additional rules if needed.

```
namespace App\Http\Controllers;

use App\Http\Requests\StoreUserRequest;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;

class UserController extends Controller
{
    public function store(Request $request)
    {
        // Example array data (in real use-case, this might come from another source)
        $data = [
            'name' => 'John Doe',
            'email' => 'john.doe@example.com',
            'password' => 'secret1234',
            'age' => 25,
            'terms' => true,
        ];

        // Retrieve rules from the request class
        $requestClass = new StoreUserRequest();
        $rulesFromRequestClass = $requestClass->rules();

        // Additional validation rules
        $additionalRules = [
            'age' => 'required|integer|min:18',
            'terms' => 'accepted',
        ];

        // Combine rules from the request class and additional rules
        $combinedRules = array_merge($rulesFromRequestClass, $additionalRules);

        // Validate the data array with the combined rules
        $validator = Validator::make($data, $combinedRules);

        if ($validator->fails()) {
            return response()->json(['errors' => $validator->errors()], 422);
        }

        // Use the validated data for further processing
        $validatedData = $validator->validated();

        // Example: Create a new user
        $user = User::create($validatedData);

        return response()->json(['message' => 'User created successfully', 'user' => $user], 201);
    }
}
```

3. Customize Validation Messages (Optional):

You can customize the validation messages in the request class as needed.

```
public function messages()
{
    return [
        'name.required' => 'The name field is required.',
        'email.required' => 'The email field is required.',
        'email.email' => 'The email must be a valid email address.',
        'password.required' => 'The password field is required.',
        'age.required' => 'The age field is required.',
        'terms.accepted' => 'You must accept the terms and conditions.',
    ];
}
```

By following these steps, you can validate array data using the validation rules defined in a request class, combined with additional rules, in your Laravel controller.