表单请求验证
最后更新于:2022-04-01 15:10:40
如果是更复杂的验证场景,你可能需要创建一个"表单请求"。表单请求是一个自定义的请求类包含了一些验证的逻辑。你可以通过 `Artisan `的命令行 make:request 来创建一个表单请求类。
~~~
php artisan make:request StoreBlogPostRequest
~~~
生成的类会放置在 `app/Http/Requests` 目录中。 我们在 `rules `方法中增加一些验证规则:
~~~
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'title' => 'required|unique|max:255',
'body' => 'required',
];
}
~~~
那么,我们的验证规则是怎么执行的呢?你所要做的只是在控制器方法中加上请求的类型提示:
~~~
/**
* Store the incoming blog post.
*
* @param StoreBlogPostRequest $request
* @return Response
*/
public function store(StoreBlogPostRequest $request)
{
// The incoming request is valid...
}
~~~
当控制器的方法被调用前,表单请求已经验证了,意味着你不需要在控制器里写任何的验证逻辑。它已经验证完了!
如果验证失败,用户会收到一个重定向请求至上一个页面。而错误信息也已经存储至 session 中方便视图展示。如果收到的是一个 AJAX 请求,一个带有 422 状态码的 HTTP 响应会被返回给浏览器,包含了一个含有错误信息的 JSON 对象。
## 授权表单请求
表单请求类同样也包含了一个 authorize 方法。通过这个方法,你可以检查认证后的用户是否有权限去更新一个已有的资源。比如,如果一个用户尝试去更新一篇博客的评论,他是否真的发布过这个评论?举个例子:
~~~
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
$commentId = $this->route('comment');
return Comment::where('id', $commentId)
->where('user_id', Auth::id())->exists();
}
~~~
注意上面例子中调用的 route 方法。这个方法允许你获取调用路由中定义的 URI 参数,比如下面例子中的 {comment} 参数:
~~~
Route::post('comment/{comment}');
~~~
如果 `authorize `方法返回 false, 一个带有 403 状态码的 HTTP 响应会被返回给浏览器,你控制器的方法也不会被执行。
如果你打算在应用的其他地方做一些权限的逻辑,在 authorize 方法中返回 true 即可:
~~~
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
~~~
## 自定义闪存后的错误信息格式
如果你想要自定义验证失败后已经闪存至 session 的错误消息格式,可以通过覆盖基类请求类(`App\Http\Requests\Request`)的 `formatErrors`。不要忘记在文件顶部引入 `Illuminate\Validation\Validator` 类:
~~~
/**
* {@inheritdoc}
*/
protected function formatErrors(Validator $validator)
{
return $validator->errors()->all();
}
~~~