Web design

Laravel --Validate (表单验证) 使用实例

2017-05-15  本文已影响438人  科哚洛夫

前言 : 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.控制器中验证数据

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

active_url

after:date

<code>'finish_date' => 'required|date|after:start_date' </code>

alpha

alpha_dash

alpha_num

array

before:date

between:min,max

boolean

confirmed

date

date_format:format

different:field

digits:value

digits_between:min,max

dimensions

**distinct **

'foo.*.id' => 'distinct'  

email

基本使用:

'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

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

nullable

not_in:foo,bar,…

numeric

present

regex:pattern

注:使用regex模式时,规则必须放在数组中,而不能使用管道分隔符,尤其是正则表达式中使用管道符号时。

required


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
上一篇下一篇

猜你喜欢

热点阅读