数据校验

目录

基础介绍

几乎每一个交互式Web应用程序都需要数据验证. 例如, 注册表单可能需要密码验证,也许email地址必须是唯一的. 验证数据可是一个繁琐的过程. 值得庆幸的是, 它在Laravel中不是这样. Validator类提供了一个神奇的验证辅助数组, 以使你做数据验证时如沐春风. 让我们看一下例子:

获得你想要验证的数据数组:

$input = Input::all();

为数据定义验证规则:

$rules = array(
    'name'  => 'required|max:50',
    'email' => 'required|email|unique:users',
);

创建验证实例并执行数据验证:

$validation = Validator::make($input, $rules);

if ($validation->fails())
{
    return $validation->errors;
}

通过errors属性, 您可以访问一个简单的信息收集类, 使你操作错误消息非常轻松. 当然, 默认的错误消息已经预置于所有验证规则上. 默认的消息的设置在language/en/validation.php中.

现在你已经熟悉了使用Validator类进行基本验证的方法. 准备好学习和深入了解数据验证规则吧!

验证规则

必需(Required)

验证属性存在且不是一个空字符串:

'name' => 'required'

英数及短线(Alpha, Alpha Numeric, & Alpha Dash)

验证属性只包括字母:

'name' => 'alpha'

验证属性只包括字母和数字:

'username' => 'alpha_num'

验证属性只包括字母, 数字, 中划线, 下划线:

'username' => 'alpha_dash'

长度(Size)

验证属性是一个给定的长度, 如果这个属性是数字则验证属性是一个给定值:

'name' => 'size:10'

验证属性是一个给定的范围之内:

'payment' => 'between:10,50'

提示: 标识的最大值和最小值也在验证规则之内.

验证属性不能小于一个给定的长度或值:

'payment' => 'min:10'

验证属性不能大于一个给定的长度或值:

'payment' => 'max:50'

数字(Numeric)

验证属性是数字:

'payment' => 'numeric'

验证属性是整数:

'payment' => 'integer'

包函和排除(Inclusion & Exclusion)

验证属性是包含在给定值之内:

'size' => 'in:small,medium,large'

验证属性是不包含在给定值之内:

'language' => 'not_in:cobol,assembler'

确认(Confirmation)

confirmed规则, 的前提是: 要验证属性包含其确认attribute_confirmation属性.

验证属性是否确认通过:

'password' => 'confirmed'

这个例子中, Validator将确保password属性和password_confirmation相同.

承认(Acceptance)

accepted规则,用来验证属性是否是yes1. 这中验证规则在验证checkbox标签时很有用, 如"服务条款”复选框.

验证属性是被承认的:

'terms' => 'accepted'

同异校验(Same & Different)

验证一个属性和另一个属性相同:

'token1' => 'same:token2'

验证一个属性和另一个属性不相同:

'password' => 'different:old_password',

正则匹配(Regular Expression Match)

match方法用来验证给定的属性匹配一个正则表达式.

验证给定的属性匹配一个正则表达式:

'username' => 'match:/[a-z]+/';

唯一性和存在性(Uniqueness & Existence)

验证一个属性子啊数据库表中是唯一的:

'email' => 'unique:users'

上面的例子中, email属性将在users表被验证唯一想. 需要验证列名和属性名不同的情况吗?没有问题:

为唯一性验证指定一个列:

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

很多时候,当更新一条数据时,你需要在唯一性验证规则后在来执行数据更新, 是要排除原有的那行数据的. 例如, 用户的个人资料更新时, 你可以让他们改变自己的email地址. 但是, unique规则运行时, 你想让它跳过给定的用户, 因为很有可能他没有改变自己的的地址. 这很容易:

强制唯一性验证忽略给定的ID:

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

验证在给定的数据库表中存在这个属性:

'state' => 'exists:states'

为存在性验证指定其他的列:

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

日期

验证日期属性在指定日期之前:

'birthdate' => 'before:1986-28-05';

验证日期属性在指定日期之后:

'birthdate' => 'after:1986-28-05';

提示: beforeafter方法是调用了PHP的strtotime函数来吧字串转成规则可以识别的日期格式的.

邮箱地址(E-Mail Addresses)

验证一个属性是邮箱地址:

'address' => 'email'

提示: 该规则是调用了PHP自带的filter_var函数.

URLs

验证属性是一个有效的地址:

'link' => 'url'

验证属性是一个有效的并且可被访问的地址:

'link' => 'active_url'

提示: active_url方法通过checkdnsr函数来验证URL的有效性.

上传(Uploads)

mimes规则用来验证文件是否是一个指定的方法MIME类型. 规则通过PHP的Fileinfo读取来确定他的实际的MIME类型. 后缀与类型的定义在config/mimes.php中, 是验证规则的参数依据:

验证文件属于指定类型的一种:

'picture' => 'mimes:jpg,gif'

提示: 验证的时候,一定要用Input::file()或Input::all()来获取文件.

验证文件是否是一个图片:

'picture' => 'image'

验证文件不会大于指定的KB:

'picture' => 'image|max:100'

检索错误信息

laravel通过一个简单的错误收集类(collector)让你很轻松的处理错误信息. 在Validator实例中调用passesfails一法, 你可以通过errors属性来访问错误. 错误收集类用几个简单的功能检索错误信息:

判定是否某个属性发生了错误:

if ($validation->errors->has('email'))
{
    // The e-mail attribute has errors...
}

取得某个属性上发生的第一个错误:

echo $validation->errors->first('email');

有时你可能把错误消息包入HTML标签中. 没问题,可以通过第二个参数传入包裹标签, 其中":message"是错误信息的占位符.

格式化一个错误信息:

echo $validation->errors->first('email', '<p>:message</p>');

取得某个属性上发生所有错误信息:

$messages = $validation->errors->get('email');

格式化某个属性上所有错误信息:

$messages = $validation->errors->get('email', '<p>:message</p>');

取得所有属性上发生所有错误信息:

$messages = $validation->errors->all();

格式化所有属性上发生所有错误信息:

$messages = $validation->errors->all('<p>:message</p>');

验证示例

一旦你已经完成您的验证, 你需要一个简单的方法把得到错误展现在视图中. laravel实现这一需求异常的简单. 让我们来完成一个典型的场景. 定义两个路由:

Route::get('register', function()
{
    return View::make('user.register');
});

Route::post('register', function()
{
    $rules = array(...);

    $validation = Validator::make(Input::all(), $rules);

    if ($validation->fails())
    {
        return Redirect::to('register')->with_errors($validation);
    }
});

好了! 我们注册了两个简单的路由. 一个用来展示表单, 一个用来处理表单提交的数据. 在POST路由中,我们对输入数据进行了一些校验. 如果校验失败, 我们跳回注册页面一次性显示存在Session中的错误信息.

但是, 请注意我们并没有明确的把错误信息绑定在GET路由上. 然而, 错误的变量仍然是在视图中可用的. Laravel智能判定是否有错误存在session中, 如果存在, 则把错误绑定到视图中. 如果session中不存在错误, 一个空的消息容器将仍然被绑定到视图中. 所以在你的视图中, 你总是可以假定有错误消息要展示, 这可以使你的编程变得简单.

自定义错误信息

想使用除默认之外的其他错误消息? 也许那你想在指定的验证规则和指定的属性上使用自定义的错误消息. 无论哪一种Validator类都可以轻松完成.

为Validator类创建自定义的错误消息数组:

$messages = array(
    'required' => 'The :attribute field is required.',
);

$validation = Validator::make(Input::get(), $rules, $messages);

好! 现在每次required验证失败时, 我们的错误消息就会被使. . 但是, :attribute占位符是什么意思么? 为了使程序灵活简便, Validator会把:attribute占位符替换成实际属性的名称! 会从属性名称中移除下划线来显示的.

其他的验证信息占位符:

$messages = array(
    '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',
);

如果你只想为email属性指定一个自定义的必填错误信息. 没问题. 只要使用 属性_规则(attribute_rule)的方式约定命名就好:

你只想为特定的属性指定一个自定义的错误信息:

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

在上例中,自定义的错误信息只会显示在email属性上,其他的属性还会显示默认信息.

然而, 如果您使用的是许多自定义错误消息, 在一行内指定可能变得繁琐和杂乱. 出于这个原因, 你可以指定使用验证规则的语言文件的custom数组作为自定义错误信息:

在验证规则的语言文件中添加自定义错误信息:

'custom' => array(
    'email_required' => 'We need to know your e-mail address!',
)

自定义验证规则

laravel提供了大量的功能强大的验证规则. 但是很可能你最终还是需要创建您自己的一些规则. 有两个用于创建验证规则的简单方法. 都是很靠谱的, 所以选择设和你工程的方法就好.

注册一个自定义验证规则:

Validator::register('awesome', function($attribute, $value, $parameters)
{
    return $value == 'awesome';
});

在这个例子中, 我们注册一个新的验证规则验证. 规则接收三个参数. 第一个是被验证的属性的名称, 第二个是被验证的属性的值, 第三个是一个规则中指定的参数数组.

自定义规则是这样被调用的:

$rules = array(
    'username' => 'required|awesome',
);

当然, 你为新规则需要定义一个错误验证消息. 在特设消息数组中设置:

$messages = array(
    'awesome' => 'The attribute value must be awesome!',
);

$validator = Validator::make(Input::get(), $rules, $messages);

或者是在language/en/validation.php中直接写入:

'awesome' => 'The attribute value must be awesome!',

如上所述, 你甚至可以指定和接收您的自定义规则中的参数列表:

// When building your rules array...

$rules = array(
    'username' => 'required|awesome:yes',
);

// In your custom rule...

Validator::register('awesome', function($attribute, $value, $parameters)
{
    return $value == $parameters[0];
}

在这种情况下, 您的验证规则的参数参数会收到一个包含一个元素的数组: "yes".

创建和存储自定义的验证规则的另一种方法是继承Validator类. 通过继承的类, 你创建一个新版本的验证类, 他拥有所有的现有功能结合您自己的自定义增加. 如果你想的话你甚至可以选择替换一些默认的方法.

首先, 在application/libraries文件夹下创建一个继承Laravel\Validator的类:

定义自定义的验证类:

<?php

class Validator extends Laravel\Validator {}

其次, 在config/application.php中删除Validator指定别名. 这是必要的, 这样会防止因两个相同的类名而冲突.

然后, 在新类中定义"awesome"规则:

Adding a custom validation rule:

<?php

class Validator extends Laravel\Validator {

    public function validate_awesome($attribute, $value, $parameters)
    {
        return $value == 'awesome';
    }

}

注意validate_rule方法名是一个约定."awesome"是规则名称方法名必须为"validate_awesome", 这是一个注册自定义规则和扩展Validator类的不同之处. Validator类只需要返回true或false就好.

请记住, 你仍然需要为您创建的任何验证规则创建一个自定义错误消息. 无论你如何定义规则创建消息的方法是相同的.