在 Laravel 5 中验证 FormRequest 中的数组

Validation of array in FormRequest in Laravel 5

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

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

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

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

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

会怎么样

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

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

 }

但这没有帮助,因为 Laravel 的验证器将使用请求对象中设置的直接字段。所以我不能在这里改变它。 我想从数组中取出单独的表单字段,并将它们直接放回 Request 对象中,因此可以使用与设置规则等相同的方式来完成验证。

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

public function store(CreateStudentRequest $request)
{
}

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

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
    }

}

我可能会自己创建卫生方法 class 并通过控制器注入它以保持代码清洁。

另外,如果方便的话,您也可以在 Javascript 一侧进行清洁。

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

我创建的Class最终是这样的

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(){

谢谢。