The question is already asked here for a previous version of laravel and not yet answered.
I have a html form
which is validated using three different Form Request Validations
. I am able to do this. But, the problem is, the form validations take place one by one. Not at the same time.
If the first form request throws a validation error the form is returned to the view
so rest of the two forms doesn't evaluated, hence a proper validation error can't be displayed to the user.
What I want is : validate the form with the three form validation requests rules
at the same time.
Controller:
public function store(TransportationRequest $request1, PurchaseRequest $request2, SaleRequest $request3)
{
//do actions here
}
I have tried with inheriting the form requests one by one but could not be succeeded.
Edit :
To be more specific to my question:
I do have three seperate forms for purchase
, transporataion
and sale
which are individually valuated using PurchaseRequest
, TransportationRequest
and SaleRequest
for individual operations.
But there is a special case where a single form handles a purchase
, transporataion
and a sale
. I want to validate the form using combining the three form request rules because I didn't want to write the same validation rules again.
This
Note : The fields in the seperate forms and combined form are same.
Thanks..
A FormRequest throws an Illuminate\Validation\ValidationException
Exception when validation fails which has a redirectTo
method, and from there the Exception Handler
performs the redirect.
You can achieve your desired behaviour by running your Form Requests manually in your controller within a try/catch block which captures the errors and combines the error bags before redirecting, or if it's essential that you run them by Laravel injecting them into your controller then you would need to add your own exception handler which captures all of the errors, combines them and then redirects after the final Form Request has ran.
However, it's worth noting, both of those approaches aren't great: they're cumbersome and are going to cause you more problems than they solve. You should try to adhere to the Laravel way of doing things as best possible if you'd like to write a maintainable application.
A Form Request exists to validate a form, therefore, each Form should have one Form Request, if you wish to compose a Form Request from different sets of rules then that should be done within the Form Request, e.g:
php artisan make:request StoreMultipleForm
From the rules
method on StoreMultipleForm
fetch the rules
for each of the other Form Requests and then return them together, e.g:
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
$formRequests = [
TransportationRequest::class,
PurchaseRequest::class,
SaleRequest::class
];
$rules = [];
foreach ($formRequests as $source) {
$rules = array_merge(
$rules,
(new $source)->rules()
);
}
return $rules;
}
Use the new composed Form Request in your controller, e.g:
public function store(StoreMultipleForm $request)
{
// Do actions here.
}
The advantages of this method are that it's self-contained, it adheres to the one form one Form Request expectation, it doesn't require changes to the Form Requests you're combining and if you need to add additional rules unique to this form you can do so without creating another Form Request.