• 基本用法
  • 处理错误消息
  • 错误消息和视图
  • 可用的验证规则
  • 有条件地添加规则
  • 自定义错误消息
  • 自定义验证规则

基本用法

Laravel提供了一个简单、方便的工具,用于验证数据并通过validation类检索验证错误消息。

基本验证示例
$validator = Validator::make(
array('name' => 'Dayle'),
array('name' => 'required|min:5')
);

传递给make方法的第一个参数是正在验证的数据。第二个参数是应该应用于数据的验证规则。

使用数组指定规则

可以使用“管道”字符或作为数组的单独元素来分隔多个规则。

$validator = Validator::make(
array('name' => 'Dayle'),
array('name' => array('required', 'min:5'))
);
验证多个字段
$validator = Validator::make(
array(
'name' => 'Dayle',
'password' => 'lamepassword',
'email' => 'email@example.com'
),
array(
'name' => 'required',
'password' => 'required|min:8',
'email' => 'required|email|unique:users'
)
);

创建验证程序实例后,可以使用fails(或passes)方法执行验证。

if ($validator->fails())
{
// 给定的数据未通过验证
}

如果验证失败,您可以从验证器检索错误消息。

$messages = $validator->messages();

您还可以访问一组失败的验证规则,而无需消息。为此,请使用失败的方法:

$failed = $validator->failed();
正在验证文件

Validator类提供了一些用于验证文件的规则,例如大小、mime和其他规则。在验证文件时,您可以简单地将它们与其他数据一起传递到验证器中。

处理错误消息

在对验证器实例调用了messages方法之后,您将收到一个MessageBag实例,该实例有各种方便的方法来处理错误消息。

检索字段的第一条错误消息
echo $messages->first('email');
检索字段的所有错误消息
foreach ($messages->get('email') as $message)
{
//
}
检索所有字段的所有错误消息
foreach ($messages->all() as $message)
{
//
}
确定字段是否存在消息
if ($messages->has('email'))
{
//
}
检索格式为的错误消息
echo $messages->first('email', '<p>:message</p>');

注意:默认情况下,消息使用与引导程序兼容的语法格式化。

检索格式为的所有错误消息
foreach ($messages->all('<li>:message</li>') as $message)
{
//
}

错误消息和视图

一旦执行了验证,就需要一种简单的方法将错误消息返回到视图中。这是laravel很方便处理的。以下列路线为例:

Route::get('register', function()
{
return View::make('user.register');
}); Route::post('register', function()
{
$rules = array(...); $validator = Validator::make(Input::all(), $rules); if ($validator->fails())
{
return Redirect::to('register')->withErrors($validator);
}
});

注意,当验证失败时,我们使用withErrors方法将验证程序实例传递给重定向。此方法将错误消息刷新到会话,以便在下次请求时可用。

但是,请注意,我们不必显式地将错误消息绑定到GET路由中的视图。这是因为Laravel将始终检查会话数据中的错误,并自动将它们绑定到视图(如果它们可用)。因此,需要注意的是,在您的所有视图中,每次请求时都会有一个$errors变量, 允许您方便地假设$errors变量始终是定义的并且可以安全地使用。$errors变量将是MessageBag的一个实例。

因此,重定向后,可以在视图中使用自动绑定的$errors变量:

<?php echo $errors->first('email'); ?>
命名错误包

如果在一个页面上有多个表单,您可能希望命名错误消息包。这将允许您检索特定表单的错误消息。只需将名称作为第二个参数传递给withErrors

return Redirect::to('register')->withErrors($validator, 'login');

然后,您可以从$errors变量访问命名的MessageBag实例:

<?php echo $errors->login->first('email'); ?>

可用的验证规则

以下是所有可用验证规则及其功能的列表:

  • Accepted
  • Active URL
  • After (Date)
  • Alpha
  • Alpha Dash
  • Alpha Numeric
  • Array
  • Before (Date)
  • Between
  • Boolean
  • Confirmed
  • Date
  • Date Format
  • Different
  • Digits
  • Digits Between
  • E-Mail
  • Exists (Database)
  • Image (File)
  • In
  • Integer
  • IP Address
  • Max
  • MIME Types
  • Min
  • Not In
  • Numeric
  • Regular Expression
  • Required
  • Required If
  • Required With
  • Required With All
  • Required Without
  • Required Without All
  • Same
  • Size
  • String
  • Timezone
  • Unique (Database)
  • URL
accepted

正在验证的字段必须是yes、on或1。这对于验证“服务条款”接受是有用的。

active_url

根据checkdnsrr PHP函数,正在验证的字段必须是有效的URL。

after:date

正在验证的字段必须是给定日期之后的值。日期将传递到PHP strtotime函数中。

alpha

正在验证的字段必须完全是字母字符。

alpha_dash

正在验证的字段可能包含字母数字字符以及破折号和下划线。

alpha_num

正在验证的字段必须完全是字母数字字符。

array

正在验证的字段必须是数组类型。

before:date

正在验证的字段必须是给定日期之前的值。日期将传递到PHP strtotime函数中。

between:min,max

正在验证的字段的大小必须介于给定的最小值和最大值之间。字符串、数字和文件的计算方式与大小规则相同。

boolean

验证中的字段必须能够转换为布尔值。接受的输入为true、false、1、0、“1”和“0”。

confirmed

正在验证的字段必须有一个匹配的foo_confirmation字段。例如,如果正在验证的字段是password,则输入中必须存在匹配的password_confirmation字段。

date

根据strtotime PHP函数,正在验证的字段必须是有效日期。

date_format:format

正在验证的字段必须与根据date_parse_from_format PHP函数定义的格式匹配。

different:field

给定字段必须与正在验证的字段不同。

digits:value

正在验证的字段必须是数字,并且必须具有精确的值长度。

digits_between:min,max

正在验证的字段的长度必须介于给定的最小值和最大值之间。

email

正在验证的字段必须格式化为电子邮件地址。

exists:table,column

正在验证的字段必须存在于给定的数据库表中。

Basic Usage Of Exists Rule
'state' => 'exists:states'
Specifying A Custom Column Name
'state' => 'exists:states,abbreviation'

您还可以指定更多将添加为查询的“where”子句的条件:

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

NULL作为“where”子句值传递将添加对空数据库值的检查:

'email' => 'exists:staff,email,deleted_at,NULL'
image

正在验证的文件必须是图像(jpeg、png、bmp或gif)

in:foo,bar,...

验证中的字段必须包含在给定的值列表中。

integer

正在验证的字段必须具有整数值。

ip

正在验证的字段必须格式化为IP地址。

max:value

验证中的字段必须小于或等于最大值。字符串、数字和文件的计算方式与大小规则相同。

mimes:foo,bar,...

正在验证的文件必须具有与列出的扩展名之一对应的MIME类型。

Basic Usage Of MIME Rule
'photo' => 'mimes:jpeg,bmp,png'
min:value

正在验证的字段必须具有最小值。字符串、数字和文件的计算方式与大小规则相同。

not_in:foo,bar,...

正在验证的字段不能包含在给定的值列表中。

numeric

正在验证的字段必须有一个数值。

regex:pattern

正在验证的字段必须与给定的正则表达式匹配。

注意:使用regex模式时,可能需要在数组中指定规则,而不是使用管道分隔符,特别是当正则表达式包含管道字符时。

required

输入数据中必须存在正在验证的字段。

required_if:field,value,...

如果字段字段等于任何值,则必须存在正在验证的字段。

required_with:foo,bar,...

只有当任何其他指定字段存在时,验证中的字段才必须存在。

required_with_all:foo,bar,...

只有当所有其他指定字段都存在时,验证中的字段才必须存在。

required_without:foo,bar,...

只有当其他指定字段不存在时,验证中的字段才必须存在。

required_without_all:foo,bar,...

只有当所有其他指定字段都不存在时,验证中的字段才必须存在。

same:field

给定字段必须与正在验证的字段匹配。

size:value

正在验证的字段必须具有与给定值匹配的大小。对于字符串数据,值对应于字符数。对于数字数据,值对应于给定的整数值。对于文件,大小对应于以千字节为单位的文件大小。

string:value

正在验证的字段必须是字符串类型。

timezone

根据时区标识符列表PHP函数,正在验证的字段必须是有效的时区标识符。

unique:table,column,except,idColumn

在给定的数据库表中,要验证的字段必须是唯一的。如果未指定column选项,则将使用字段名。

Basic Usage Of Unique Rule
'email' => 'unique:users'
Specifying A Custom Column Name
'email' => 'unique:users,email_address'
Forcing A Unique Rule To Ignore A Given ID
'email' => 'unique:users,email_address,10'
Adding Additional Where Clauses

您还可以指定更多将添加为查询的“where”子句的条件:

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

在上述规则中,只有帐户id为1的行才会包含在唯一检查中。

url

正在验证的字段必须格式化为URL。

注意:此函数使用PHP的filter was方法。

有条件地添加规则

在某些情况下,您可能希望仅当输入数组中存在某个字段时才对该字段运行验证检查。要快速完成此操作,请将“有时”规则添加到规则列表中:

$v = Validator::make($data, array(
'email' => 'sometimes|required|email',
));

在上面的示例中,只有当电子邮件字段出现在$data数组中时,才会对其进行验证。

复杂条件验证

有时,仅当另一个字段的值大于100时,才需要给定的字段。或者,只有当存在另一个字段时,才需要两个字段具有给定值。添加这些验证规则不一定很麻烦。首先,使用静态规则创建一个验证程序实例,这些规则永远不会更改:

$v = Validator::make($data, array(
'email' => 'required|email',
'games' => 'required|numeric',
));

假设我们的web应用程序是为游戏收藏者设计的。如果一个游戏收集器在我们的应用程序中注册,并且他们拥有100多个游戏,我们希望他们解释为什么他们拥有这么多游戏。例如,也许他们经营一家游戏转卖店,或者他们只是喜欢收藏。为了有条件地添加这个需求,我们可以在验证器实例上使用有时方法。

$v->sometimes('reason', 'required|max:500', function($input)
{
return $input->games >= 100;
});

传递给有时方法的第一个参数是我们要条件验证的字段的名称。第二个参数是我们要添加的规则。如果作为第三个参数传递的闭包返回true,则将添加规则。这种方法使得建立复杂的条件验证变得轻而易举。您甚至可以同时为多个字段添加条件验证:

$v->sometimes(array('reason', 'cost'), 'required', function($input)
{
return $input->games >= 100;
});

注意:传递给闭包的$input参数将是Illuminate\Support\Fluent的实例,可以用作访问输入和文件的对象。

自定义错误消息

如果需要,可以使用自定义错误消息进行验证,而不是使用默认值。有几种方法可以指定自定义消息。

将自定义消息传递到验证器
$messages = array(
'required' => 'The :attribute field is required.',
); $validator = Validator::make($input, $rules, $messages);

注意:属性占位符将替换为被验证字段的实际名称。您还可以在验证消息中使用其他占位符。

其他验证场所持有人
$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',
);
为给定属性指定自定义消息

有时您可能希望仅为特定字段指定自定义错误消息:

$messages = array(
'email.required' => 'We need to know your e-mail address!',
);
在语言文件中指定自定义消息

在某些情况下,您可能希望在语言文件中指定自定义消息,而不是将它们直接传递给验证器。为此,请将消息添加到app/lang/xx/validation.php语言文件中的自定义数组中。

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

自定义验证规则

注册自定义验证规则

Laravel提供了各种有用的验证规则;但是,您可能希望指定一些自己的验证规则。注册自定义验证规则的一种方法是使用Validator::extend方法:

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

自定义验证器闭包接收三个参数:正在验证的$attribute的名称、属性的$value$param数组

您还可以将类和方法传递给扩展方法而不是闭包:

Validator::extend('foo', 'FooValidator@validate');

请注意,您还需要为自定义规则定义错误消息。可以使用内联自定义消息数组或通过在验证语言文件中添加条目来执行此操作。

扩展验证器类

与使用闭包回调来扩展验证器不同,您还可以扩展验证器类本身。为此,请编写一个扩展Illuminate\Validation\Validator的验证程序类。可以通过将验证方法添加到类中,然后用验证:

<?php

class CustomValidator extends Illuminate\Validation\Validator {

    public function validateFoo($attribute, $value, $parameters)
{
return $value == 'foo';
} }
注册自定义验证器解析程序

接下来,您需要注册您的自定义验证器扩展:

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

创建自定义验证规则时,有时可能需要为错误消息定义自定义占位符替换。您可以通过创建自定义验证器(如上所述)并向验证器添加replaceXXX函数来完成此操作。

protected function replaceFoo($message, $attribute, $rule, $parameters)
{
return str_replace(':foo', $parameters[0], $message);
}

如果要添加自定义消息“replacer”而不扩展Validator类,可以使用Validator::replacer方法:

Validator::replacer('rule', function($message, $attribute, $rule, $parameters)
{
//
});

laravel的Validation检索验证错误消息的更多相关文章

  1. Laravel 5.5 FormRequest 自定义错误消息 postman调试时X-Requested-With设为XMLHttpRequest

    Laravel 5.5 FormRequest 自定义错误消息 使用FormRequest进行表单验证,就不用让验证逻辑和控制器里面的逻辑都混在一起.但在使用的时候呢,发现json错误返回的数据,与我 ...

  2. [原创]java WEB学习笔记71:Struts2 学习之路-- struts2常见的内建验证程序及注意点,短路验证,非字段验证,错误消息的重用

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  3. java struts2入门学习---中文验证、对错误消息的分离、结果(result)类型细节配置

    一.需求 利用struts2实现中文验证并对错误消息的抽离. 详细需求:用户登录-->不填写用户名-->页面跳转到用户登录页面,提示用户名必填(以英文和中文两种方式提示)-->填写英 ...

  4. laravel的表单验证(下面有些信息未验证,转的)

    后台写法: 1.1类的方法 $rules = [ 'email'=>'required|between:4,20', 'password'=>'required|between:6,20' ...

  5. SpringMVC——类型转换和格式化、数据校验、客户端显示错误消息

    在介绍类型转换和格式化之前,我首先来介绍 <mvc:annotation-driven />. 需要导入的 schema: xmlns:mvc="http://www.sprin ...

  6. Go Revel - Validation(验证)

    Revel提供了内建函数用于验证参数.它提供了: 一个`Validation`上下文集合来管理验证错误信息(键与消息内容) 辅助函数用于检查数据并将错误信息放入上下文 一个模板函数用于从`Valida ...

  7. Yii 验证和消息

    setFlash(), getFlash()可以完成验证成功后提示 <?php # 成功信息提示 Yii::app()->user->setFlash('success', &quo ...

  8. 允许asp.net MVC报 错说明: 访问服务此请求所需的资源时出错。服务器可能未配置为访问所请求的 URL。错误消息 401.2。: 未经授权

    运行mvc3程序报以下错误 详细报错如下: “/”应用程序中的服务器错误. 访问被拒绝. 说明: 访问服务此请求所需的资源时出错.服务器可能未配置为访问所请求的 URL. 错误消息 401.2.: 未 ...

  9. "错误消息 401.2。: 未经授权: 服务器配置导致登录失败。"的解决办法

    [详细报错如下]: “/”应用程序中的服务器错误. 访问被拒绝. 说明: 访问服务此请求所需的资源时出错.服务器可能未配置为访问所请求的 URL. 错误消息 401.2.: 未经授权: 服务器配置导致 ...

随机推荐

  1. Java工作流系统jflow从表功能介绍一

    关键词:工作流快速开发平台  工作流流设计  业务流程管理   asp.net 开源工作流  bpm工作流系统  java工作流主流框架  自定义工作流引擎 表单设计器  流程设计器 从表也叫明细表, ...

  2. 查询MS SQL的版本号

    可以使用全局变量@@VERSION或者是使用SERVERPROPERTY()函数: 参考: SELECT @@VERSION SELECT SERVERPROPERTY('Edition') Sour ...

  3. Mac下搭建selenium环境

    1,安装selenium 打开terminal,使用以下命令安装selenium:   pip install -U selenium 2,下载chromedriver,并放在python的安装根目录 ...

  4. Node.js文档-模块

    核心模块 Node为Javascript提供了很多服务器级别的API,绝大多数都被包装到了一个具名的核心模块中,例如文件操作的fs核心模块,http服务构建的http模块等,核心模块的使用必须通过re ...

  5. 想在don‘t starve中活的更久?那饥荒海难攻略你怎么能不知道!

    饥荒海难mac版是一款非常好玩的烧脑游戏.玩家将扮演一个勇敢的绅士科学家威尔逊,被一个恶魔困住并送到一个神秘的荒野世界,玩家必须利用异世界中的自然资源让自己存活下去,并且抵御各种异世界生物的威胁.想在 ...

  6. Anaconda 包管理与环境管理

    包管理命令 conda命令 安装包 conda install 包名称 卸载包 conda remove 包名称 更新包 conda update 包名称 模糊查询 conda search 包名称 ...

  7. C#中的异步编程--探索await与async关键字的奥妙之处,原来理解和使用异步编程可以这么简单

    前言 await与async是C#5.0推出的新语法,关于await与async有很多文章讲解.但看完后有没有这样一种感觉,感觉这东西像是不错,但好像就是看不太懂,也不清楚该怎么使用.虽然偶有接触,但 ...

  8. 阿里巴巴Java开发手册之并发处理注意事项

    1. [强制]获取单例对象需要保证线程安全,其中的方法也要保证线程安全.说明:资源驱动类.工具类.单例工厂类都需要注意.2. [强制]创建线程或线程池时请指定有意义的线程名称,方便出错时回溯.正例:p ...

  9. mybatis中用到的9种设计模式

    1.Builder模式:例如SqlSessionFactoryBuilder.XMLConfigBuilder.XMLMapperBuilder.XMLStatementBuilder.CacheBu ...

  10. DataReader类型化数据读取与装箱性能研究

    前言 在各种ORM框架或者SQL映射框架(例如MyBatis,SOD框架之SQL-MAP功能)中,都有将查询的结果映射为内存对象的需求,包括映射到实体类.简单类型(例如Java的POJO,.NET的P ...