最一开始对表单数据进行验证都是直接在控制器的方法中手工调用validator来进行验证,比如:
public function update(User $user, Request $request)
{
$this->validate($request, [
'name' => 'required|max:50',
'password' => 'nullable|confirmed|min:6',
]);
}
虽然很简单直观,但是有个致命缺点,就是需要验证的内容较多的话,会使controller代码量增大,无法做到代码的复用,也不适合进行复杂的逻辑验证。
而laravel中提供的表单请求验证就可以很好的解决这个问题。
工作机制
首先需要利用laravel提供的依赖注入功能,在控制器方法update()中传入所依赖的组件UserRequest,当执行update()方法的时候,就会触发触发表单请求类的自动验证机制。
public function update(UserRequest $request, User $user)
{
$user->update($request->all());
return redirect()->route('users.show', $user->id)->with('success', '个人资料更新成功!');
}
默认使用表单请求类中的rule()方法进行验证,所以需要我们自定义验证规则。只有当验证通过时,才会执行update()方法中的代码,否则会抛出异常,并附带着验证失败的信息重定向到上一个页面。
...
class UserRequest extends FormRequest
{
...
public function rules()
{
return [
'name' => 'required|between:3,25|regex:/^[A-Za-z0-9\-\_]+$/|unique:users,name,' . Auth::id(),
'email' => 'required|email',
...
];
}
}
可以在表单请求类中通过messages()方法自定义表单的提示信息。
public function messages()
{
return [
'name.unique' => '该用户名已被占用,请重新填写',
'name.regex' => '用户名只支持英文、数字、横杠和下划线。',
'name.between' => '用户名必须介于 3 - 25 个字符之间。',
'name.required' => '用户名不能为空。',
];
}
番外:对“依赖注入”的理解一直都不深刻,个人感觉这应该算是一个简单的“依赖注入”实例吧!