文档章节

10. Laravel 4 验证

成武
 成武
发布于 2013/12/21 23:00
字数 1943
阅读 4133
收藏 4

如何进行验证

典型的注册表单:

<!-- app/views/form.blade.php -->
{{ Form::open(array('url' => 'registration')) }}
    {{-- Username field. ------------------------}}
    {{ Form::label('username', 'Username') }}
    {{ Form::text('username') }}
    {{-- Email address field. -------------------}}
    {{ Form::label('email', 'Email address') }}
    {{ Form::email('email') }}
    {{-- Password field. ------------------------}}
    {{ Form::label('password', 'Password') }}
    {{ Form::password('password') }}
    {{-- Password confirmation field. -----------}}
    {{ Form::label('password_confirmation', 'Password confirmation') }}
    {{ Form::password('password_confirmation') }}
    {{-- Form submit button. --------------------}}
    {{ Form::submit('Register') }}
{{ Form::close() }}

路由部分:

// app/routes.php
Route::get('/', function()
{
    return View::make('form');
});
Route::post('/registration', function()
{
    // 获取所有表单数据.
    $data = Input::all();
    // 创建验证规则
    $rules = array(
        'username' => array('alpha_num', 'min:3')
    );
    // 开始验证
    $validator = Validator::make($data, $rules);
    if ($validator->passes())
    { // 验证成功
        return 'Data was saved.';
    } // 验证失败
    return Redirect::to('/');
});

可用的验证规则

regex:pattern(正则)

验证此规则的值必须符合给定的正则表达式。

accepted(yes|no|1)

验证此规则的值必须是 yes、 on 或者是 1。这在验证是否同意"服务条款"的时候非常有用。

in:foo,bar,...(in 规则)

验证此规则的值必须在给定的列表中存在。

notin:_foo,bar,...(not in 规则)

验证此规则的值必须在给定的列表中不存在。

alpha(全部字母)

验证此规则的值必须全部由字母字符构成。

numeric(数字)

验证此规则的值必须是一个数字。

alpha_num(字母|数字)

验证此规则的值必须全部由字母和数字构成。

alpha_dash(字母|数字|中划线|下划线)

验证此规则的值必须全部由字母、数字、中划线或下划线字符构成。

url(合法 URL,不严谨)

验证此规则的值必须是一个合法的 URL。
注意: 已经证实此规则不严谨,类似 2http://url.com 的 URL 可以通过验证。

active_url(合法 URL,基于 checkdnsrr)

验证此规则的值必须是一个合法的 URL,根据 PHP 函数 checkdnsrr。
注意: 由于是基于 checkdnsrr 因此也可用于验证邮箱地址是否存在。

email(电子邮件)

验证此规则的值必须是一个合法的电子邮件地址。

image (jpeg|png|bmp|gif)

验证此规则的值必须是一个图片 (jpeg, png, bmp 或者 gif)。

integer(整数)

验证此规则的值必须是一个整数。

ip(IP 地址)

验证此规则的值必须是一个合法的 IP 地址。

before:date(给定日期之前)

验证此规则的值必须在给定日期之前,日期将通过 PHP 函数 strtotime 传递。

after:date(给定日期之后)

验证此规则的值必须在给定日期之后,日期将通过 PHP 函数 strtotime 传递。

between:min,max(min 和 max 之间)

验证此规则的值必须在给定的 min 和 max 之间。字符串、数字以及文件都将使用大小规则进行比较。

confirmed(二次确认域,如“密码的二次确认域”)

验证此规则的值必须和 foo_confirmation 的值相同。比如,需要验证此规则的域是 password,那么在输入中必须有一个与之相同的 password_confirmation 域。

same:field(值与给定域相同)

验证此规则的值必须与给定域的值相同。

size:value(大小与给定域的值相同)

验证此规则的值的大小必须与给定的 value 相同。
对于字符串,value 代表字符的个数,
对于数字,value 代表它的整数值,
对于文件,value 代表文件以KB为单位的大小。

date(合法日期字符串,基于 strtotime)

验证此规则的值必须是一个合法的日期,根据 PHP 函数 strtotime。

dateformat:_format(format 格式 y-m-d H:i:s)

验证此规则的值必须符合给定的 format 的格式,根据 PHP 函数 date_parse_from_format。

different:field(不同于)

验证此规则的值必须与指定的 field 域的值不同。

min:value(最小值)

验证此规则的值必须大于最小值 value。字符串、数字以及文件都将使用大小规则进行比较。

max:value(最大值)

验证此规则的值必须小于最大值 value。字符串、数字以及文件都将使用大小规则进行比较。

mimes:foo,bar,...(MIME 类型限制)

验证此规则的文件的 MIME 类型必须在给定的列表中。

MIME 规则的基础使用
'photo' => 'mimes:jpeg,bmp,png'

注意: 当使用 regex 模式的时候,有必要使用数组指定规则,而不是管道分隔符,特别是正则表达式中包含一个管道字符的时候。

required(必填)

验证此规则的值必须在输入数据中存在。

requiredif:_field,value(当指定域为某个值时,必填)

当指定的域为某个值的时候,验证此规则的值必须存在。

requiredwith:_foo,bar,...(当指定域存在时,必填)

仅当指定的域存在的时候,验证此规则的值必须存在。

requiredwithout:_foo,bar,...(当指定域不存在时,必填)

仅当指定的域不存在的时候,验证此规则的值必须存在。

exists:table,column(必须存在于 table 表的 column 字段数据中)

验证此规则的值必须在指定的数据库的表中存在。

Exists 规则的基础使用
'state' => 'exists:states'

指定列名

'state' => 'exists:states,abbreviation'

您也可以指定更多的条件,将以 "where" 的形式添加到查询。

'email' => 'exists:staff,email,account_id,1'

unique:table,column,except,idColumn(数据库唯一)

验证此规则的值必须在给定的数据库的表中唯一。如果 column 没有被指定,将使用该域的名字。

Unique 规则的基础使用
'email' => 'unique:users'

指定列名

'email' => 'unique:users,email_address'

强制忽略一个给定的 ID

'email' => 'unique:users,email_address,10'

添加额外的where语句
你还可以指定更多条件,这些条件将被添加到查询的"where"语句中:

'email' => 'unique:users,email_address,NULL,id,account_id,1

在上面的规则中,只有account_id 为 1 的行才会被包含到unique检查中。

如何获取错误消息

构造为 JSON 数据(API)

Route::post('/registration', function()
{
    // 获取全部提交数据
    $data = Input::all();
    // 构造规则数组
    $rules = array(
        'username' => 'alpha_num'
    );
    // 开始验证
    $validator = Validator::make($data, $rules);
    if ($validator->passes())
    { // 验证通过
        return 'Data was saved.';
    } // 验证失败
    // 获取错误消息
    $errors = $validator->messages();
    // 构造 JSON 响应
    return Response::json($errors);
});

重定向,直接传递至下一个页面

return Redirect::to('/')->withErrors($validator);
视图中如何获取传递过来的错误消息

注意: $errors 是系统预定义变量,任何模板中均可使用。

获取一个域的第一个错误消息
{{ $errors->first('username') }}
获取一个域的全部错误消息
@foreach($errors->get('username') as $message)
    <li>{{ $message }}</li>
@endforeach
获取全部域的全部错误消息
@foreach($errors->all() as $message)
    <li>{{ $message }}</li>
@endforeach
检查一个域是否存在消息
@if($errors->has('email'))
    <p>Yey, an error!</p>
@endif
以某种格式获取一条错误消息
{{ $errors->first('username', '<span class="error">:message</span>') }}

注意: 默认情况下,消息将使用与 Bootstrap 兼容的语法进行格式化。

以某种格式获取所有错误消息
@foreach($errors->all('<li>:message</li>') as $message)
    {{ $message }}
@endforeach

定制验证规则

注意: 匿名函数 和 指向普通类方法 的 规则扩展 并不推荐,因此直接介绍如何直接扩展官方的验证器。

编写扩展验证器类:

class ExValidator extends Illuminate\Validation\Validator {
    // 规则
    public function validateFoo($attribute, $value, $parameters)
    {
        return $value == 'foo';
    }
    // 消息
    protected function replaceFoo($message, $attribute, $rule, $parameters)
    {
        return str_replace(':foo', $parameters[0], $message);
    }
}

注册定制的验证器扩展:

Validator::resolver(function($translator, $data, $rules, $messages)
{
    return new ExValidator($translator, $data, $rules, $messages);
});

详细的编写方法请参照官方类 /vendor/laravel/framework/src/Illuminate/Validation/Validator.php

定制验证消息

针对某一个验证规则:

$messages = array(
    'required' => 'The :attribute field is required.',
);
$validator = Validator::make($input, $rules, $messages);

针对指定域的某一规则:

$messages = array(
    'email.required' => 'We need to know your e-mail address!',
);

在语言文件中定义 /app/lang/zh-CN/validation.php

'custom' => array(
    'email' => array(
        'required' => '请填写您的 email 地址。',
    ),
),

© 著作权归作者所有

共有 人打赏支持
成武
粉丝 87
博文 31
码字总数 15565
作品 0
福州
程序员
为什么 Laravel 会成为最成功的 PHP 框架

模块化和可扩展性   Laravel注重代码的模块化和可扩展性。你可以在包含超过5500个程序包的Packalyst目录中找到你想要添加的任何文件。Laravel的目标是让你能够找到任何想要的文件。   微...

slagga
2016/08/14
351
0
laravel 5.6 登录验证码 captcha 引入

用户登陆注册, 不管前台后台, 如果掌握了手机短信和图形验证码, 那安全性会好很多, PHP上常见有两个captcha图形验证方式, gregwar/captcha和mews/captcha 参考下面的连接,用mews/capt...

天飞
04/23
0
0
Laravel5.2之Validator

引言: Laravel提供了Validator模块,可解决表单提交验证等一些需求,并且可以在视图View中显示错误验证信息,交互还是很友好的。注明:作者水平有限,有错误或建议请指正,轻拍。 概述: La...

botkenni
2016/10/10
50
0
Laravel 5.0 发布,支持 Scheduler 和 Elixir

Laracon 2015 昨天正式上线,今天正式发布 Laravel 5! Laravel 5 包括超过 22 个新特性,详情请看这里。 Laravel 5.0 引入了一个新鲜的应用架构到默认的 Laravel 项目中,这个架构会提供更好...

raykwok
2015/02/04
6K
16
Yosemite Intellij idea php设置xdebug单步调试

PHP设置单步调试 一直看看PHP语法,最近看貌似很火的laravel,还有一个基于laravel/framework的OctoberCRM,一直没找到方式做单步调试,今天总算达成了。 IDE用的Intellij idea,Android Stu...

zmhot88
2015/04/04
0
2

没有更多内容

加载失败,请刷新页面

加载更多

下一页

docker中安装了RabbitMQ后无法访问其Web管理页面

在官网找了"$ docker run -d --hostname my-rabbit --name some-rabbit -p 8080:15672 rabbitmq:3-management"这条安装命令,在docker上安装了RabbitMQ,,结果输入http://localhost:8080并不......

钟然千落
25分钟前
0
0
spring-cloud | 分布式session共享

写在前面的话 各位小伙伴,你们有福了,这一节不仅教大家怎么实现分布式session的问题,还用kotlin开发,喜欢kotlin的小伙伴是不是很开心! 以前在写Android的时候,就对客户端请求有一定的认...

冯文议
45分钟前
0
0
c语言之内存分配笔记

先看一个数组: short array[5] = {1,2} // 这儿定义的一个int类型的数组,数组第1和第2个元素值是1和2.其余后面默认会给值为0; 或者 short array[] = {1,2};//这儿数组第1和第2个元素,数组...

DannyCoder
今天
4
0
Shell | linux安装包不用选择Y/N的方法

apt-get install -y packageOR echo "y" | sudo apt-get install package

云迹
今天
2
0
Hadoop的大数据生态圈

基于Hadoop的大数据的产品圈 大数据产品的一句话概括 Apache Hadoop: 是Apache开源组织的一个分布式计算开源框架,提供了一个分布式文件系统子项目(HDFS)和支持MapReduce分布式计算的软件架...

zimingforever
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部