在 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(){
谢谢。
我使用 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(){
谢谢。