3分钟短文:Laravel表单验证的“指挥中心”:表单请求类

引言上一章我们学习到 , Laravel控制器内引入 ValidatesRequests trait , 从而使得继承了基类控制器的类拥有了验证器的所有方法 。但是无论在控制器内进行验证 , 还是前置到路由器内验证 , 都会加重这些区域的代码重量 , 特别是对于复杂的验证逻辑 , 甚至使得控制器或者路由功能不那么纯粹 。
3分钟短文:Laravel表单验证的“指挥中心”:表单请求类文章插图
那么有没有什么好的设计方法 , 把数据验证独立出来 , 统一管理 , 重复利用 , 不要写那么多臃肿的代码呢?这就是本文我们重点要介绍的 FormRequest 表单请求类 。
代码时间声明一个表单请求类 , 使用命令行脚手架可以轻松完成:
php artisan make:request CreateCommentRequest创建的文件位于 app/Http/Requests/CreateCommentRequest.php 。 为了与修改后的代码有个对比 , 我们把默认的文件内容贴在下方:
【3分钟短文:Laravel表单验证的“指挥中心”:表单请求类】namespace App\Http\Requests;use Illuminate\Foundation\Http\FormRequest;?class CreateCommentRequest extends FormRequest{public function authorize(){return false;}?public function rules(){return [];}}注意表单请求类默认继承了 FormRequest 类 , 默认的方法有两个:
第一个是 authorize 用于验证是否有权限使用该验证器 , 示例中始终返回 false , 也就是说任何调用 , 都不被允许 , 系统返回 403 状态码 。
第二个方法是 rules , 用于返回一个验证规则组成的数组 。 这个规则的写法 , 与上一章我们介绍的规则方法毫无二致 。
下面我们根据业务逻辑 , 首先修改 authorize 方法 , 满足以下两个条件 , 才允许验证:

  • 必须登录状态
  • 用户必须发布过帖子
下面是代码的实现:
public function authorize(){$blogPostId = $this->route('blogPost');if (! auth()->check()) {return false;}$isExisted = BlogPost::where('id', $blogPostId)->exists();if (! $isExisted) {return false;}return true;}大家看到了吧 , 在验证器内可以横向使用模型数据查询 , 来进行数据一致性判断 。 其中还有一个潜在的知识点要说一下 , 就是代码开头的那个 $this->route() 方法 , 其实是用来获取路由绑定参数的方法 。 这要求我们在路由注册里 , 有类似下面这样的条目:
Route::post('blogPosts/{blogPost}', function () {})使用路由位置参数绑定传递的值 , 可以使用 $this->route()方法读取 , 这与 get/post 方法的获取有所不同 , 大家要记得区分 。
好了 , 授权做完了 , 下面该验证规则上场了 , 一旦通过验证的数据进入到验证环节 , 就要执行 rules 方法内定义的规则 , 我们修改代码如下:
public function rules(){return ['body' => 'required|max:1000'];}这只是一个示例啊 , 大家将就看一看 , 更多验证规则在文档或者源码里 , 有详细的说明 。
完成上述的表单请求类之后 , 就可以在代码内引入使用了 。 最简单的 , 在路由文件内使用依赖注入实例化该类:
Route::post('blogPosts/{blogPost}/comment', function (App\Http\Requests\CreateCommentRequest $request) {// 存储数据});这条路由是我们上述代码中演示位置参数 blogPost 时引入了 , 我们在执行方法中引入了表单请求类 , laravel自动会将请求数据代入到该类内执行验证 。
我们使用 FormRequest 改造验证方法之后 , 不仅引入了资源的权限判断 , 还把验证规则独立出来 , 可用于独立维护 , 或者集中管控 , 是不是方便多了?
写在最后本文用了一个对博客帖子创建评论内容的方法 , 将验证规则在 FormRequest 内实现 。 我们完全可以从最后一个写作方法中延伸出更多的花样玩法 , 大家可以去github借鉴大神的写法 , 学习更多技巧 。
Happy coding :-)
我是@程序员小助手 , 专注编程知识 , 圈子动态的IT领域原创作者