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