🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
如果是更复杂的验证场景,你可能需要创建一个"表单请求"。表单请求是一个自定义的请求类包含了一些验证的逻辑。你可以通过 `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(); } ~~~ ~~~