【问题标题】:Validation of array in FormRequest in Laravel 5Laravel 5中FormRequest中的数组验证
【发布时间】:2015-10-04 21:08:34
【问题描述】:

我使用 Ajax 将表单数据发送到资源控制器 (Laravel 5)。但是,我将此调用作为数组发送表单字段(没有直接表单字段变量)

我已经设置了一个请求,其中包含需要验证的规则。

然而,这种验证的默认行为是它只查看请求对象内的直接字段变量。因此,例如,如果我要发送:input name="firstname",我只需要设置

public function rules()
{
    return [
        'firstname' => 'required|alpha|between:1,128'
    ];
}

但是现在,我如何验证 Request 对象中的数组呢?例如,如果我发送 input name="nameArray['firstname']" 会怎样?

所以我想做的是在将 Request 对象发送到验证之前对其进行修改。或者也许有更好的方法来处理这个问题。我知道可以像这样在规则方法中循环对象:

 foreach($this->request->get('nameArray') as $key => $val)
 {

 }

但这无济于事,因为 Laravel 的 Validator 将使用 Request 对象中设置的直接字段。所以我不能在这里改变它。 我想从数组中取出各个表单字段,然后将它们直接放回 Request 对象中,因此可以使用设置规则等相同的方式进行验证。

顺便说一句,我使用这种验证方法,通过在资源控制器中调用 Request 方法,在本例中,我想存储输入。

public function store(CreateStudentRequest $request)
{
}

【问题讨论】:

    标签: laravel-5 laravel-validation


    【解决方案1】:

    确实,中间件似乎可以完成这项工作。遇到了另一种方法,其中使用新的验证器方法扩展了类请求。但是,在我看来,中间件功能就是为此而生的。

    我创建的类最终是这样的

    class SanitizeFormRequest
    {
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if(isset($request['ajaxData']))
        {
            $input = $request['ajaxData'];
            foreach ($input as $key => $value) {
                $request->merge([$key => $value]);
            }
        }
        return $next($request);
    }
    

    }

    我在 kernel.php 中将它注册为 $routeMiddleware

    并应用于相关路线。

    Route::group(array('middleware' => ['auth', 'form.request']), function(){
    

    谢谢。

    【讨论】:

      【解决方案2】:

      我会创建一个中间件来清理请求对象。

      class SanitizeMiddleware
      {
          /**
           * Run the request filter.
           *
           * @param  \Illuminate\Http\Request  $request
           * @param  \Closure  $next
           * @return mixed
           */
          public function handle($request, Closure $next)
          {
              // here do the sanitation needed to 
              // make the request object work with the validator
          }
      
      }
      

      我可能会在它自己的类上创建卫生方法,然后通过控制器将其注入以保持代码干净。

      如果这对你来说更容易的话,你也可以在 Javascript 端进行卫生处理。

      【讨论】:

        猜你喜欢
        • 2017-02-03
        • 2020-06-25
        • 2019-12-14
        • 2015-08-17
        • 1970-01-01
        • 2015-10-10
        • 1970-01-01
        • 2016-01-06
        • 2018-06-04
        相关资源
        最近更新 更多