程序员小助手|3分钟短文:Laravel把数据验证的手伸向“请求体”

引言
上一章讲述了表单数据验证 , 从前端页面接收用户的输入信息 , 通过POST方法提交数据到相应路由地址 , 并使用Request请求体的validate方法 , 默认传入request()->input()的参数 , 并调用传入的验证规则 , 从而实现数据的初步筛选 。
程序员小助手|3分钟短文:Laravel把数据验证的手伸向“请求体”
文章图片
把数据验证 , 验证规则 , 和控制器的逻辑处理代码混合在一起 , 是不是有点怪怪的?我们说 , 一个中间层只做一件事情 , 这样才能松耦合 , 提高鲁棒性 。
所以有了这篇文章 , 教你把数据验证提炼出来 。
代码时间
laravel在请求相关的业务逻辑上设计的很灵活 , 你完全可以把验证流程从控制器方法中剥离出去 , 这样你只需在相关的层面 , 专注于相关的逻辑就可以了 。
首先使用命令行创建一个请求体对象:
【程序员小助手|3分钟短文:Laravel把数据验证的手伸向“请求体”】phpartisanmake:requestEventStoreRequest
输出内容如下:
Requestcreatedsuccessfully
上述方法会生成一个文件位于app/Http/Requests/EventStoreRequest.php , 我们把系统默认的代码贴出来:
namespaceAppHttpRequests;useIlluminateFoundationHttpFormRequest;classEventStoreRequestextendsFormRequest{publicfunctionauthorize(){returnfalse;}publicfunctionrules(){return[];}}
其中authorize方法用于实现逻辑判断 , 那些用户 , 或者满足那些条件可以使用该请求体 。 返回false表示所有调用均不被允许验证 , 也就是不会调用任何rules方法声明的规则 。
此处我们还没有关于权限判断的需求 , 所以 , 让所有调用此请求类的方法 , 都默认调用验证规则 , 只需修改上述方法如下:
publicfunctionauthorize(){returntrue;}
其中rules方法执行了需要执行的验证器的规则 , laravel默认内置了很多常用规则 , 基本够用 。 使用方法见上一节我们的文章 。
现在 , 把上一节中所使用的验证规则拿来 , 修改rules方法如下:
publicfunctionrules(){return['name'=>'required|min:10|max:50','max_attendees'=>'required|integer|digits_between:2,5','description'=>'required'];}
规则所表示的意义我们在上一节已经详细介绍了 。 我们把目光放在如何使用该请求体 。
回到控制器EventController的store方法内 , 这个是restfulapi中用于接收POST请求体数据 , 并写入数据库的操作 。 此处我们需要指定请求体类型 , 使其默认使用EventStoreRequest , 这样就可以发挥验证规则的作用了 。
使用依赖注入方式 , 直接在store方法内实例化一个请求体:
useAppHttpRequestsEventStoreRequest;publicfunctionstore(EventStoreRequest$request){$event=Event::create($request->input());returnredirect()->route('events.show',['event'=>$event]);}
使用此方法 , 使我们的代码精简了很多 。 最重要的数据验证 , 交给了EventStoreRequest类来完成 , 这就完成了代码层的分离 。
默认内置的验证规则所返回的错误信息提示 , 不满足使用的话 , 还可以自定义 , 在EventStoreRequest内实现messages方法就可以了:
publicfunctionmessages(){return['required'=>'必填字段:attribute','name.min'=>'最少10个字符','name.max'=>'最多50个字符','max_attendees.digits_between'=>'2-5位数字'];}
这完全是上一章的手动自定的返回信息 , 写在此处作为数组返回就搞定了 。
写在最后
本文深入laravel数据验证的方法 , 从特殊走向一般 , 并尝试把验证相关的代码从控制器内分离出来 。 使用自定义的请求体类 , 成功实现了代码的分离 , 而可控制性也更强了 。 而验证规则 , 和自定义的错误信息 , 则没有一丝丝改变!


推荐阅读