15
votes

is it possible, in Laravel 5, to validate multiple Requests in order to insert related models after a form submission?
I know how to validate multiple Model by using Validators but I want to do it with the Request Class.

Laravel 4 :

$validateUser = Validator::make(Input::all(), User::$rules);
$validateRole = Validator::make(Input::all(), Role::$rules);

if ($validateUser->fails() || $validateRole->fails()){
    $validationMessages = array_merge_recursive(
        $validateUser->messages()->toArray(),
        $validateRole->messages()->toArray()
    );
}

Laravel 5 :

Request one

class CreateUserRequest extends Request {

    public function rules()
    {
        //
    }
}

Request two

class CreateRoleRequest extends Request {

    public function rules()
    {
        //
    }
}

Controller Model call :

public function store(CreateUserRequest $request, CreateRoleRequest $request2)
{
    //
}

How can I validate the User input values and the Role input values using the Request approach? (and have a specific feedback if validation fails)

1
For sure I did. And as espected it doesnt work at all. I think we can't use 2 Request as parameter. Every input fields are attached to the first Request parameter. - Charles Follet
Doesn't work means only one request is validated? - lukasgeiter
Exactly. I think i can validate everything in one Request but I want to do it in a cleaner way by separating the validation. - Charles Follet
I just tried it and it actually worked with type hinting two request classes. (both validate() methods were called). I suppose in your real code you don't have the CreateUserRequest and UserRequest discrepancy? - lukasgeiter
Oh, yes sorry just edited. Can i see how you manage everything ? Like what do you have in your form, what do you have in your Requests and what do you have in your controller. A working example or i don't know. How does your Request know what input it has to check and what it hasn't? - Charles Follet

1 Answers

13
votes

First, using multiple form request classes works perfectly fine.


Now of course you can't just have two forms in one. However what you can do to separate your data, is to use the array syntax for field names:

<input type="text" name="user[name]" />
<!-- and later -->
<input type="text" name="role[name]" />

In your validation rules you can then use the dot syntax to reference either the user name or the role name:

public function rules(){
    return [
        'role.name' => 'required'
    ];
}

And for creating the two models, just use this to get all the attributes for user and role:

$request->input('user'); // returns an array like ['name' => 'foo', 'other-user-field' => 'bar']
$request->input('role'); // returns an array like ['name' => 'baz', 'other-role-field' => 'boom']