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'  

email

  • 验证字段必须是格式化的电子邮件地址 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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容

  • 1、简介 Laravel 提供了多种方法来验证应用输入数据。默认情况下,Laravel 的控制器基类使用Valid...
    伊Summer阅读 1,491评论 0 4
  • 验证 简介 Laravel 对验证应用的输入数据提供了多中途径的实现。默认的,Laravel 的基础控制器类使用了...
    Dearmadman阅读 10,155评论 5 8
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,087评论 18 139
  • 表单基础知识 在HTML中,表单是由 元素来表示的,而在JS中,表单对应的则是HTMLFormElement类型。...
    oWSQo阅读 889评论 0 1
  • 原文链接 必备品 文档:Documentation API:API Reference 视频:Laracasts ...
    layjoy阅读 8,510评论 0 121