# 在控制器中 验证 request 请求数据
$this->validate($request,[rules,$messages=[],$authorize=[]]);
# $requset :请求实例对象
# rules :验证规则
# $messages :自定义错误消息
# $customAttributes:得到验证错误的自定义属性(如果不知道,使用默认值吧)
# 第四个参数:参考下面的attributes()方法;(使用方法一致)
# 讨论一下validate方法中的几个参数的用法
//> $request :该参数Request类的实例对象,主要是包含请求的HTTP的所有信息
//> rules :验证规则(这里不多解释,参看手册用法即可)
//> $messages :自定义错误信息(这里注意:大多数情况下,我们都需要自定义错误信息)(如果不需要自定义错误信息省略该参数)
# 规则如下(该方法应该返回 属性/规则对 数组 以及对应的错误消息)
[
'name.required' => ':attribute字段必须填写',
'mobile.required' => ':auttrbute字段必须填写',
]
# 定义请求类
php artisan make:request Blog
# 该命令会在 app/Http/Requests目录下 创建一个 Blog 类
# 我们看一下在Blog类中可以使用的几个方法
# 1. 首先我们来看看 rules() 方法(就如同validate()方法中的$rules参数)
public function rules()
{
//> 返回一个数组
return [
'name' => 'bail|required',
'mobile' => 'required'
];
}
# 2. 我们看看自定义错误消息 方法 messages() (该方法如同validate()中的$message参数)
public function messages()
{
//> 该方法 也只需要返回一个 数组
return [
'name.required' => ':attribute字段必须填写',
'mobile.required' => '请输入手机号码'
];
}
# 3. 错误消息属性(替换属性对应的消息替换)
# 该方法 和 messages() 方法结合使用(如果省略默认替换为属性名称)
public function attributes()
{
return [
'name' => '名称' //> 替换:attribute => name => 名称
];
}
# blog类提供的 认证表单请求(用于检测当前请求是否有资格)
public function authorize()
{
//> 获取路由参数(假设路由定义为 'photos/{users}/create')
//> 这里获取的都是 users 传递的参数(如果有必要可以进行ROM验证查询)
$users = $this->route('users')
//> return bool 需要返回一个 布尔值
//> true:认证通过 继续 验证请求数据
}
# 如果返回 false Laravel 默认返回一个403响应(如果存在视图403.blade.php就渲染)
# 返回给定的错误数据(建议使用默认值)
# 验证失败时,一次性存入session中的数据格式(默认数组形式)
# 重定向 redirect()->to()->withErrors()存入的数据
protected function formatErrors(Validator $validator)
{
return $validator->getMessageBag()->toArray();
}
# 我们来看一下Blog类的父类FormRequest.php 提供的几个属性
protected $dontFlash = ['password', 'password_confirmation'];
# 该属性指定验证失败返回上次请求时携带的session数据排除数组中的
# 如何使用Blog请求验证类
# 在指定控制器动作参数 注入 Blog类即可 比如:
public function store(PhotoBlog $request)
{
//> 控制器中 这里不需要任何代码(自动验证Blog类)
}
# 如果请求是 Ajax 时:框架会响应422状态码给用户,并在响应数据中宝航JSON格式的验证错误信息
- 手动验证器(就是在控制器中使用Validaor门面验证请求数据)
# 这种形式 是 我们不想使用 控制器中的$this-validate()方法时
Validator::make(request()->all(),$rules,$messages,$attrible);
# 使用参数参考上面(唯一方便的就是,我们可以自定义跳转位置)(参考手册)
if ($validator->fails()) {
return redirect('post/create') //> 跳转位置
->withErrors($validator) //> 错误信息
->withInput(); //> 表单请求数据
}
//> ----------- 使用ValidatesRequest trait提供的自动重定向(添加validate()方法)
Validator::make(request()->all(),$rules,$messages,$attrible)->validate();
- 错误包(处理我们在一个页面有多个表单时,区分不同的错误信息)
# 在重定向的withErrors中传递
return redirect('register')
->withErrors($validator, 'login'); //> 登录错误包 login
# 视图中使用方式
{{ $errors->login->first('email') }} //> 这种形式
# 在Blog请求验证类中:我们该如何处理呢?
# FormRequest 请求验证父类 存在这样一个属性
protected $errorBag = 'default'; //> 该属性 指定当前 错误包名称
# 我们来看看 MessageBag.php 定义的接口中的抽象方法(实现)
# keys() 获取当前错误信息中的所有键值(Array)
{{ $errors->default->keys() }}
# add(string $key,string $message):向错误信息中添加错误信息
$errors->add('sex','新添加');
# merage(MessageProvider|Array $message):合并错误信息
# has(string|Array $keys):判断给定属性是佛存在
# first(string $key=null,string $format=null):获取第一个错误信息(当然也可以指定属性和格式)
$errors->first();
# get(string $key,string $format=null):获取给定属性信息,指定格式
{{ $errors->get('mobile','<li>:message</li>') }}
# all(string $format=null):获取当前错误信息包的所有信息(指定错误格式)
{{ $errors->all() }}
{{ $errors->all('<li>:message</li>') }}
# getFormat():返回当前格式(如上面的:message或<li>:message</li>)
# setFormat(string $format=':message'):设置格式
# isEmpty():判断message bag是否为空
# count():判断message错误信息个数
# toArray() 得到一个数组
# 看一下错误rules替换
$messages = [
'same' => 'The :attribute and :other must match.',
'size' => 'The :attribute must be exactly :size.',
'between' => 'The :attribute must be between :min - :max.',
'in' => 'The :attribute must be one of the following types: :values',
];
# :size :attribute 与验证有关
# 错误信息rules匹配规则(每个规则对应一个错误信息)
# 如下面
[
'name.requeired' => ':attribute字段必须填写',
'name.date' => ':attribute字段需要日期类型',
'mobile.after' => ':attribute字段必须是:date后面日期'
]
accepted
# 验证值必须是 yes、on、1、true(在"同意服务协议"时有用)
active_url
# 验证当前ip或host(域名DNS是否合规(参考checkdnsrr函数))
url
# 验证字段必须是基于PHP函数 filter_var 过滤的有效的url
ip
# 验证字段必须是IP地址
JSON
# 验证字段必须是有效的JSON字符串
email
# 验证字段必须是格式化的电子邮箱地址
//> after:date :判断当前字段必须是date日期后的某个值(单独使用时)
'start_time' => 'bail|required|date|after:2016-12-12'
# start_time 输入值必须是2016-12-12后的某个值
# 配合其他字段使用时(比如:在查询某个自定的日期范围时)(after:date通常配合date使用)
'start_time' => 'bail|required|date',
//> 日期格式
'end_time' => 'bail|required|date|after:start_time',
//> 当前end_time值必须在start_time值后面
//> before:date :则是跟after:date相反的寓意
alpha :该字段必须是字母(字母一般值得事英文、日文等字母)
alpha_num :该字段必须是字母或数组
alpha_dash :字母、数组、(-)破折号、(_)下划线
array
# 该字段必须是php数组
distinct
# 验证字段不能包含重复值(处理数组时)
# 如:'foo.*.id' => 'distinct'
between:min,max
# 验证给定值在最小值和最大值之间(包括字符串、数组等)
digits_between:min,max
# 验证字段数值长度必须介于最小值和最大值之间
digits:value
# 验证字段必须是数字且【长度】为value指定的值
integer
# 验证字段必须是【整形】
numeric
# 验证字段必须是【数值】
boolean
# 验证字段能否被转换为布尔类型
regex:pattern
# 验证字段必须匹配给定正则表达式
# 注意:使用正则时,|符号放在[]中使用(以免和分割符号|冲突)
present
# 验证字段必须出现在输入数据值中(可以为空)
filled
# 验证当前字段如果存在则不能为空
required //> :输入字段不能为空
# 1. 值为 null
# 2. 值是空字符串
# 3. 值是空数组或空的Coutable对象
# 4. 值是上传文件但路径为空
required_if:anotherFiled,value,...
# 验证当前字段在 anotherFiled字段等于value值时(当前字段是必须填写的)
required_unless:anotherfield,value,...
# 验证当前字段(除了anotherfield字段等于value时)当前字段必须填写
required_with:foo,bar,...
# 验证当前字段(只有在foo,bar,...其中任一字段存在时,该字段必须填写)
required_with_all:foo,bar,...
# 验证当前字段(只有在foo,bar,...上面字段都存在时,该字段必须填写)
required_without:foo,bar,...
# 验证当前字段(只有在foo,bar,...其中任一字段不存在时,该字段必须填写)
required_without_all:foo,bar,...
# 验证当前字段(只有在foo,bar,...所有字段都不存在时,该字段必须填写)
same:field
# 当前字段值 必须和 field字段值匹配
different:field
# 验证当前字段必须是和filed字段不同的值
size:value
# 当前字段值 必须和value值匹配尺寸
# 字符串:匹配的是字符串的数目
# 文件:匹配的是相应文件字节数
string
# 验证字段必须是字符串
timezone
# 验证字符必须是基于PHP函数timezone_identifiers_list的有效时区标识
confirmed
# 验证字段必须有一个匹配字段foo_confirmed
# 比如:我们验证password,必须存在字段password_confirmed字段(在注册时有用)
date
# 验证字段必须是一个基于PHPstrtotime函数的有效日期
date_format:format
# 验证字段必须和指定格式一致(format:如 y/m/d等)(参看date_parse_from_format函数)
in:foo,bar,...
# 验证字段值必须在给定的列表中(如:foo,bar,...)
in_array:另一个字段
# 验证字段必须在另一个字段中存在(????)
exists:table,column
# 验证字段必须存在指定数据表中
dimensions
# 验证图片尺寸必须满足规定参数
file
# 验证字段必须是上传成功的文件
image
# 验证文件必须是图片(jpeg、png、bmp、gif、svg)
'state' => 'exists:states', # 验证当前值state存在表states字段中
sometimes
# 只有某个字段存在情况下才进行检查
'email' => 'sometimes|required|eamil' # email字段存在时,才会验证这里
# sometimes 验证其他
网友评论