Laravel --Validate (表单验证) 使用实例
前言 : Laravel 提供了多种方法来验证应用输入数据。默认情况下,Laravel 的控制器基类使用ValidatesRequests trait,该trait提供了便利的方法通过各种功能强大的验证规则来验证输入的 HTTP 请求。
要掌握 Laravel 强大的验证特性,让我们先看一个完整的验证表单并返回错误信息给用户的例子。
在这之前如果您是首次接触 Laravel 而且并不知道路由如何跳转到指定的控制器 可以查看博主的Restfulapi或者Laravel官网对路由的介绍,在这里就不做介绍了。
一、使用方法
1.视图中的表单
上半部分的 div 包含的内容是当表单出现错误时 模版输出错误原因的地方(css样式laravel已经帮您配置好了 在public/bootstrap/css/bootstrap.min.css中写好了样式)
<div class="errors">
@if(count($errors)>0)
<div class="box-body">
<div class="alert alert-danger alert-dismissible">
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
<h4><i class="icon fa fa-ban"></i>错误:</h4>
@foreach($errors->all() as $error)
{{$error}}
@endforeach
</div>
</div>
@endif
</div>
下面是一个简单的表单提交(由于是展示案例 没有写样式)
<form action="/test" method="post">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
<label> 推荐码:</label> <input type="text" name="code">
<label>人员名称:</label> <input type="text" name="name">
<label>所属单位:</label> <input type="text" name="team">
<label>年 龄:</label> <input type="number" name="age">
<label>毕业院校:</label> <input type="text" name="school">
<label>产品案例网址:</label> <input type="url" name="url">
<button type="submit" class="btn btn-block btn-social">添加数据</button>
</form>
2.控制器中验证数据
-
表单的发送post请求,到test路由中 发送了_token, code, name, team, age, school, url 7个数据;
-
如果我的路由是以Restfulapi的写法,它会根据我的提交方式自己找到控制器中对应的store方法:
Route::resource('test', 'TestController');
完整的控制器验证方法如下(Validate验证方式)
下面做一些简单的验证(具体各个验证的方法底部列出详情)
public function store(Request $request)
{
//
$data = \Input::all();
// 数据验证
$this->validate($request, [
'code' => 'required|digits:32', //必填 必须32位
'name' => 'required|min:2|max:16', //必填 最小2位 最大16位
'team' => 'required|string', //必填 字符串
'age' => 'required|numeric', //必填 数值
'school' => 'required|max:255', //必填 最大255位
'url' => 'required|url' //必填 必须是网址
]);
// 以上是表单验证 没有验证成功是不会走下面的逻辑程序的 而且页面上会响应出抛出的异常信息
....
....
....
}
如图:
表单
完整的控制器验证方法如下(Validator验证方式)
// 规则
$rules = array(
'code' => 'required|digits:32', //必填 必须32位
'name' => 'required|min:2|max:16', //必填 最小2位 最大16位
'team' => 'required|string', //必填 字符串
'age' => 'required|numeric', //必填 数值
'school' => 'required|max:255', //必填 最大255位
'url' => 'required|url' //必填 必须是网址
);
// 验证器
$validator = \Validator::make($data,$rules);
// 进行验证
if($validator->passes()){
// 验证成功后的业务逻辑
...
...
}else{
// 失败后 返回提交页的页面并抛出错误
return back()->withErrors('在这里自定义错误原因!');
}
Ps : 如果是使用 Validate方式验证,是哪个字段出现问题,就抛该字段的异常 默认lang是只有英语的,所以如果为了客户体验,还需要安装一个中文语言包,安装包地址 中文语言包地址
备注:表单验证一般称为服务器验证,服务器验证前,应该做客户体验更好的前端表单验证
验证规则大全
accepted
- 在验证中该字段的值必须是yes、on、1或true,这在“同意服务协议”时很有用。
active_url
- 该字段必须是一个基于PHP函数checkdnsrr 的有效URL
after:date
-
该字段必须是给定日期后的一个值,日期将会通过PHP函数strtotime传递:
<code>'start_date' => 'required|date|after:tomorrow' </code>
-
你可以指定另外一个比较字段而不是使用strtotime验证传递的日期字符串:
<code>'finish_date' => 'required|date|after:start_date' </code>
alpha
- 该字段必须是字母
alpha_dash
- 该字段可以包含字母和数字,以及破折号和下划线
alpha_num
- 该字段必须是字母或数字
array
- 该字段必须是PHP数组
before:date
- 验证字段必须是指定日期之前的一个数值,该日期将会传递给PHP strtotime函数。
between:min,max
- 验证字段尺寸在给定的最小值和最大值之间,字符串、数值和文件都可以使用该规则
boolean
- 验证字段必须可以被转化为boolean,接收true, false, 1,0, "1", 和 "0"等输入。
confirmed
- 验证字段必须有一个匹配字段fooconfirmation,例如,如果验证字段是password,必须输入一个与之匹配的passwordconfirmation字段
date
- 验证字段必须是一个基于PHP strtotime函数的有效日期
date_format:format
- 验证字段必须匹配指定格式,该格式将使用PHP函数dateparsefromformat进行验证。你应该在验证字段时使用date或dateformat
different:field
- 验证字段必须是一个和指定字段不同的值
digits:value
- 验证字段必须是数字且长度为value指定的值
digits_between:min,max
- 验证字段数值长度必须介于最小值和最大值之间
dimensions
-
验证的图片尺寸必须满足该规定参数指定的约束条件:
<code>'avatar' => 'dimensions:min_width=100,min_height=200' </code>
-
有效的约束条件包括:min_width, max_width, min_height, max_height, width, height, ratio
-
ratio约束应该是宽度/高度,这可以通过表达式3/2或浮点数1.5来表示:
<code>'avatar' => 'dimensions:ratio=3/2' </code>
**distinct **
- 处理数组时,验证字段不能包含重复值:
'foo.*.id' => 'distinct'
-
验证字段必须是格式化的电子邮件地址 exists:table,column
-
验证字段必须存在于指定数据表
基本使用:
'state' => 'exists:states'
指定自定义列名:
'state' => 'exists:states,abbreviation'
还可以添加更多查询条件到where查询子句:
'email' => 'exists:staff,email,account_id,1'
这些条件还可以包含!:
'email' => 'exists:staff,email,role,!admin'
还可以传递NULL或NOT NULL到where子句:
'email' => 'exists:staff,email,deleted_at,NULL'
'email' => 'exists:staff,email,deleted_at,NOT_NULL'
有时,你可能需要为exists查询指定要使用的数据库连接,这可以通过在表名前通过.前置数据库连接来实现:
'email' => 'exists:connection.staff,email'
file
- 该验证字段必须是上传成功的文件
filled
- 该验证字段如果存在则不能为空
image
-
验证文件必须是图片(jpeg、png、bmp、gif或者svg) in:foo,bar…
-
验证字段值必须在给定的列表中
in_array:另一个字段
验证字段必须在另一个字段中存在
integer
验证字段必须是整型
ip
验证字段必须是IP地址
JSON
验证字段必须是有效的JSON字符串
max:value
验证字段必须小于等于最大值,和字符串、数值、文件字段的size规则一起使用 mimetypes:text/plain…
验证文件必须匹配给定的MIME文件类型之一:
'video' => 'mimetypes:video/avi,video/mpeg,video/quicktime'
为了判断上传文件的MIME类型,框架将会读取文件内容来猜测MIME类型,这可能会和客户端MIME类型不同。 mimes:foo,bar,…
验证文件的MIMIE类型必须是该规则列出的扩展类型中的一个
MIMIE规则的基本使用:
'photo' => 'mimes:jpeg,bmp,png'
尽管你只需要指定扩展,该规则实际上验证的是通过读取文件内容获取到的文件MIME类型。 完整的MIME类型列表及其相应的扩展可以在这里找到:http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types
min:value
- 验证字段的最小值,和字符串、数值、文件字段的size规则一起使用
nullable
- 验证字段必须为null,这在验证一些可以为null的原生数据如整型或字符串时很有用。
not_in:foo,bar,…
- 验证字段值不在给定列表中
numeric
- 验证字段必须是数值
present
- 验证字段必须出现在输入数据中但不能为空。
regex:pattern
- 验证字段必须匹配给定正则表达式
注:使用regex模式时,规则必须放在数组中,而不能使用管道分隔符,尤其是正则表达式中使用管道符号时。
required
-
输入字段值不能为空,以下情况字段值都为空:
-
值为null
-
值是空字符串
-
值是空数组或者空的Coutable对象
-
值是上传文件但路径为空
required_if:anotherfield,value,…
验证字段在另一个字段等于指定值value时是必须的
required_unless:anotherfield,value,…
除了 anotherfield 字段等于value,验证字段不能空
required_with:foo,bar,…
验证字段只有在任一其它指定字段存在的话才是必须的
required_with_all:foo,bar,…
验证字段只有在所有指定字段存在的情况下才是必须的
required_without:foo,bar,…
验证字段只有当任一指定字段不存在的情况下才是必须的
required_without_all:foo,bar,…
验证字段只有当所有指定字段不存在的情况下才是必须的
same:field
给定字段和验证字段必须匹配
size:value
验证字段必须有和给定值value相匹配的尺寸,对字符串而言,value是相应的字符数目;对数值而言,value是给定整型值;对文件而言,value是相应的文件字节数
string
验证字段必须是字符串
timezone
验证字符必须是基于PHP函数timezoneidentifierslist的有效时区标识
unique:table,column,except,idColumn
验证字段在给定数据表上必须是唯一的,如果不指定column选项,字段名将作为默认column。
指定自定义列名:
'email' => 'unique:users,email_address'
自定义数据库连接
有时候,你可能需要自定义验证器生成的数据库连接,正如上面所看到的,设置unique:users作为验证规则将会使用默认数据库连接来查询数据库。要覆盖默认连接,在数据表名后使用“.”指定连接:
'email' => 'unique:connection.users,email_address'
强制一个唯一规则来忽略给定ID:
有时候,你可能希望在唯一检查时忽略给定ID,例如,考虑一个包含用户名、邮箱地址和位置的”更新属性“界面,当然,你将会验证邮箱地址是唯一的,然而,如果用户只改变用户名字段而并没有改变邮箱字段,你不想要因为用户已经拥有该邮箱地址而抛出验证错误,你只想要在用户提供的邮箱已经被别人使用的情况下才抛出验证错误,要告诉唯一规则忽略用户ID,可以传递ID作为第三个参数:
'email' => 'unique:users,email_address,'.$user->id
如果你的数据表使用主键字段不是id,可以指定第四个输入参数:
'email' => 'unique:users,email_address,'.$user->id.',user_id'
添加额外的where子句:
还可以指定更多条件给where子句:
'email' => 'unique:users,email_address,NULL,id,account_id,1'
在上述规则中,只有account_id为1记录才会进行唯一性检查。
url
验证字段必须是基于PHP函数filter_var过滤的的有效URL