Laravel 5.5 - 同时验证多个表单请求

iam*_*.in 6 php validation request-validation laravel laravel-5.5

此处已针对先前版本的 laravel提出该问题,但尚未回答。

我有一个html form使用三个不同的Form Request Validations. 我有能力做到这一点。但是,问题是,表单验证是一一进行的。不是同时。

如果第一个表单请求引发验证错误,则该表单将返回给view其余的两个表单,因此不会评估,因此无法向用户显示正确的验证错误。

我要的是:验证表单与三个表单验证请求rules在同一时间

控制器:

public function store(TransportationRequest $request1, PurchaseRequest $request2, SaleRequest $request3)
    {
        //do actions here
    }
Run Code Online (Sandbox Code Playgroud)

我试过一一继承表单请求,但没有成功。

编辑 :

更具体地说明我的问题:

我有三个独立的形式purchasetransporataion以及sale其使用单独计价PurchaseRequestTransportationRequest并且SaleRequest对单个操作。

但是有一个特殊情况,在一个单一的形式处理一个purchasetransporataion和一个sale我想使用组合三个表单请求规则来验证表单,因为我不想再次编写相同的验证规则。

这个

注意:单独表格和组合表格中的字段相同。

谢谢..

sam*_*sam 12

Illuminate\Validation\ValidationException当具有redirectTo方法的验证失败时,FormRequest 抛出异常,然后异常Handler执行重定向

您可以通过在 try/catch 块中的控制器中手动运行表单请求来实现您想要的行为,该块捕获错误并在重定向之前组合错误包,或者如果您必须通过 Laravel 将它们注入控制器来运行它们,那么您需要添加您自己的异常处理程序来捕获所有错误,将它们组合起来,然后在最终的表单请求运行后重定向。

但是,值得注意的是,这两种方法都不是很好:它们很麻烦,并且会给您带来比它们解决的问题更多的问题。如果你想编写一个可维护的应用程序,你应该尽量坚持 Laravel 做事的方式。

存在表单请求以验证表单,因此,每个表单应该有一个表单请求,如果您希望从不同的规则集组成表单请求,那么应该在表单请求中完成,例如:

  1. 为您的表单定义表单请求 php artisan make:request StoreMultipleForm
  2. rules方法StoreMultipleFormrules为每个其他表单请求获取 ,然后将它们一起返回,例如:

    /**
     * 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;
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在您的控制器中使用新的组合表单请求,例如:

    public function store(StoreMultipleForm $request)
    {
        // Do actions here.
    }
    
    Run Code Online (Sandbox Code Playgroud)

这种方法的优点是它是自包含的,它遵循一个表单请求的期望,不需要更改您正在合并的表单请求,如果您需要添加此表单独有的其他规则,您可以在不创建另一个表单请求的情况下这样做。

  • 您写了一个很好的答案,但为了保持完整,我认为您需要对每个答案调用授权函数。 (2认同)