我们来检验表单提交中的name,age,height 3个数据 要求结果以json形式返回:便于与前端页面进行交互
方式1:在控制器中,使用 Validator 进行验证
public function doedit(UserRequest $request){
$input = $request->all();
$rules = [
'name'=>'required|email',
'age'=>'required',
'height'=>'required|digits_between:10,11',
];
$message = [
'name.*'=>'姓名不能为空',
'age.required'=>'年龄不能为空',
'height.*'=>'身高不能为空输入错误',
// 'height.digits_between'=>'身高必须是10在11之间'
];
//分离验证组件 中文处理
$validator = Validator::make($input,$rules,$message );
if ($validator->fails()) {
return response()->json(array(
'success' => false,
'message' => 'There are incorect values in the form!',
'errors' => $validator->getMessageBag()->toArray()
));
}
}
1.关于$rules中的定义:我们回顾下,平常表单要验证的部分 手机+邮箱+非必填+必填+多选一填写等,这些规则全部可以检验,如果实在不行,可以自定义检验规则,这部分不是分析的重点;
2.Validator::make 方法中,如果我们不传入第三个参数,默认的提示将会是 英文的自带提示,这对中文用户是不友好的,一旦我们定义message信息后,就会按照我们定义的来,当我们定义了多个检验规则 想采用同一个提示时,使用*进行处理多个字段 。
3.如果失败后,直接判断输出json信息,我们基本上完成了。
问题来了,我们想抽离验证部分以实现公用,怎么办??
方式2:抽离式Request检验
先生成一个检验件:
php artisan make:request UserRequest
生成的代码如下
class UserRequest extends Request
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return fasle;
}
/**
* Get the validation rules that apply to the request.
* 插入和更新验证的区别怎么区分
* @return array
*/
public function rules()
{
return [
'name'=>'required',
'age'=>'required',
'height'=>'required|digits_between:10,11',
];
}
}
这时候我们只需在doedit方法中的参数传入 UserRequest 即可
public function doedit(UserRequest $request){
}
这时候,我们提交表单,发现403出现 Forbidden 原因就是authorize() 中返回了false 验证不通过,我们这里不需要认证机制 直接改成true即可。
中文支持:我们定义下我们需要的message
class UserRequest extends Request
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;//return false; //Forbidden 进不来
}
/**
* Get the validation rules that apply to the request.
* 插入和更新验证的区别怎么区分
* @return array
*/
public function rules()
{
return [
'name'=>'required',
'age'=>'required',
'height'=>'required|digits_between:10,11',
];
}
//定义出错后的message信息:
public function messages() {
return [
'name.required'=>'姓名不能为空',
'age.required'=>'年龄不能为空',
'height.required'=>'身高不能为空',
];
}
}
这种情况下 ajax json请求后,发生了422错误,有信息返回
{
"name":["\u59d3\u540d\u4e0d\u80fd\u4e3a\u7a7a"],
"age":["\u5e74\u9f84\u4e0d\u80fd\u4e3a\u7a7a"],
"height":["The height must be between 10 and 11 digits."]
}
但是不是我们想要的信息格式,我们想要得到在控制器中使用Validator验证输出的信息格式,怎么办??
于是我们只能去找方法,我们猜想下laravel设计者应该设计了基于验证失败后的处理方法吧:
顺藤摸瓜,找到FormRequest类 Illuminate\Foundation\Http\FormRequest.php 我们验证下当时的想法,
这时,看到一个方法:failedValidation(Validator $validator) 这不就是验证失败会执行的方法吗,直接覆盖就好
了.
此时代码如下:
最后完成的部分大概是:
class UserRequest extends Request
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;//return false; //Forbidden 进不来
}
/**
* Get the validation rules that apply to the request.
* 插入和更新验证的区别怎么区分
* @return array
*/
public function rules()
{
return [
'name'=>'required',
'age'=>'required',
'height'=>'required|digits_between:10,11',
];
}
//定义出错后的message信息:
public function messages() {
return [
'name.required'=>'姓名不能为空',
'age.required'=>'年龄不能为空',
'height.required'=>'身高不能为空',
];
}
//认证失败之后的处理
// public function failedAuthorization() {
// exit('非法进入') ;
// parent::failedAuthorization();
// }
// woo 改变验证后的默认行为: 变成 ajax
public function failedValidation( \Illuminate\Contracts\Validation\Validator $validator ) {
exit(json_encode(array(
'success' => false,
'message' => 'There are incorect values in the form!',
'errors' => $validator->getMessageBag()->toArray()
)));
}
}
网友评论