//验证规则
$rules=[
    'password'=>'required||between:3,20||confirmed',
];
//验证规则提示信息
$msg=[
    'password.required'=>'新密码不能为空',
    'password.between'=>'新密码必须6~20位之间',
    'password.confirmed'=>'密码和确认密码不匹配',
];

下面是所有的可用的验证约束和它们的功能的列表:

accepted

验证的字段必须为 yeson,1,或者 true。这通常用来验证服务条款的承诺。

active_url

验证的字段必须可以通过 checkdnsrr PHP 方法的验证。

after:date

验证的字段必须是给定日期之后的值。日期会被传递到 strtotime PHP 方法:

`start_date' => 'required|date|after:tomorrow'

你也可以指定使用其它字段的日期来进行评估:

'finish_date' => 'required|date|after:start_date'

alpha

验证的字段必须全部是由字母字符组成的字符串。

alpha_dash

验证的字段可以是字母,数字,-,_ 所组成的字符串。

alpha_num

验证的字段必须全部由字母或数字所组成。

array

验证的字段必须是一个 PHP array

before:date

验证的字段的值必须比指定的日期要早。指定的日期会被传递到 PHP 的 strtotime 方法。

between:min,max

验证的字段的大小必须在给定的 min 和 max 之间。字符串,数字和文件都会使用和 size 约束的相同的评估方式。

boolean

验证的字段必须能够转换为布尔值。所接受的输入可以是 truefalse10"1""0"

confirmed

验证的字段必须能够和 foo_confirmation 字段相匹配。比如,如果验证的字段是 password,相应的password_confirmation 字段必须在输入中被提供且与 password 相匹配。

date

验证的字段必须是一个有效的日期,它应该能被 strtotime PHP 方法通过。

date_format:format

验证的字段必须匹配给定的格式。该格式会被 PHP date_parse_from_format 方法评定,你应该只使用 date 或者date_format 其中之一来进行验证字段,不要全部都使用。

different:field

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

digits:value

验证的字段必须是数字类型并且具有指定的长度。

digits_between:min,max

验证的字段必须具有指定区间的长度。

dimensions

验证的字段必须是一个图片类型的,并且要求符合指定的参数约束:

'avatar' => 'dimensions:min_with=100,min_height=200'

可用的参数有:min_widthmax_widthmin_heightmax_heightwidthheightratio

distinct

当与数组协作时,验证的字段中必须不能含有重复的值:

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

email

验证的字段必须是一个邮件地址的格式。

exists:table,column

验证的字段必须能在指定数据库表中检索的到。

Exists 基础约束用法

'state' => 'exists:states'

指定自定义列名称

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

你也可以像使用 where 语句一样指定添加更多的查询条件:

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

查询条件也可以使用 ! 来表明否定值:

'eamil' => 'exists:staff,email,role,!admin'

你也可以传递 NULL 或者 NOT_NULL 到查询语句中:

'eamil' => 'exists:staff,email,deleted_at,NULL''eamil' => 'exists:staff,email,deleted_at,NOT_NULL'

极个别的情况下,你可能需要在 exists 查询下指定特定的数据库连接。你可以使用 . 语法将数据库连接名前置来进行指定:

'email' => 'exists:connection.staff,email'

filled

验证的字段如果出现,那么它一定不能为空值。

p_w_picpath

被验证的文件必须是一个图片类型(jpeg,png,bmp,gif,svg)

in:foo,bar,...

验证的字段必须是给定值列中的一个。

in_array:anotherfield

验证的字段必须是指定的字段中值列之一。

integer

验证的字段必须是一个整数。

ip

验证的字段必须是一个 IP 地址。

json

验证的字段必须是合法的 JSON 字符串

max:value

验证的字段必须小于等于指定值。字符串,数字,和文件类型会与 size 约束使用相同的评估方法。

mimetypes:text/plain,...

验证的字段必须匹配给定的 MIME 类型:

'video' => 'mimetypes:video/avi,video/mpeg,video/quicktime'

为了判断所上传文件的 MIME 类型,laravel 会读取文件的内容并且会尝试猜测文件的 MIME 类型,这可能会与客户端提供的文件 MIME 类型有所区别。

mimes:foo,bar,...

验证的文件的 MIME 类型相应的后缀必须是所列的值之一。

基础用法

'photo' => 'mimes:jpeg,bmp,png'

你只需要指定文件的扩展,这个约束会针对文件的内容进行猜测文件的 MIME 类型,然后进行扩展验证。

完整的 MIME 类型和其相应的扩展后缀,你可以从 这里 找到。

min:value

验证的字段必须比指定的值要小。字符串,数字和文件类型会使用 size 约束相同的评估方法。

not_in:foo,bar,...

验证的字段不应该包含在给定的值列中。

numeric

验证的字段必须是一个数值类型。

present

验证的字段必须要求被提供,但是可以为空。

regex:pattern

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

注意:当使用 regex 模式时,你必须将约束放进数组里来取代管道符分隔,特别是在正则表达式中包含管道符时。

required

验证的字段必须被提供并且不能为空值。判断空值的依据:

  • 值是 null

  • 值是空字符串

  • 值是一个空数组或者空的 Countable 对象

  • 值是一个没有传递路径的上传的文件

required_if:anotherfield,value,...

验证的字段必须在以下情况下被提供:指定的字段等于任意列出的值。

required_unless:anotherfield,value,...

验证的字段必须在以下情况下被提供: 所指定的字段和所提供的值都不相等。

required_with:foo,bar,...

验证的字段只有在其它所指定字段之一被提供时才会被要求提供。

required_with_all:foo,bar,...

验证的字段只有在其它所指定字段全部被提供时才会被要求提供。

required_without:foo,bar,...

验证的字段只有在其它所指定字段之一没有被提供时被要求提供。

required_without_all:foo,bar,...

验证的字段只有在所指定字段全部没有被提供时才会被要求提供。

same:field

所验证的字段必须与指定的字段相匹配。

size:value

验证的字段必须具有给定值的大小。对于字符串数据,值应该是字符串的字符长度。对于数值数据,值应该是相应的整数值。对于数组,大小匹配数组的 count 大小。对于文件,应该匹配文件的字节大小。

string

验证的字段必须是一个字符串。

timezone

验证的字段必须是经过 PHP timezone_identifiers_list 方法验证的合法的 timezone 标识。

unique:table,column,except,idColumn

验证的字段必须在给定的数据表中唯一,如果 column 选型没有被指定,那么会直接使用字段的名字。

指定自定义的列名

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

自定义数据库连接

极少数情况下,你可能需要指定自定义的数据库连接来进行验证。就如上面所看到的,设置 unique:users 会使用默认的数据库连接来进行约束验证。如果想指定其他数据库连接,你可以使用 . 语法并前置指定数据库连接:

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

强迫 Unique 约束 忽略给定的 ID

有时候,你可能会希望 unique 检查忽略给定的 ID。比如,考虑一下一个更新个人信息的场景,它应该提供用户的名称,邮箱地址,和位置。你可能会想要验证邮箱的唯一性。但是你只想验证与用户的当前邮箱不一致的邮箱的唯一性。也就是说你只想验证这个邮箱有没有被其他用户所使用。你需要传递 ID 作为第三个参数来通知 unique 约束来忽略当前用户的 ID:

'email' => 'unique:users,email_address,'.$user->id

如果表名使用的主键列名不是 id ,那么你还需要指定主键的列名到第四个参数:

'email' => 'unique:users,email_address,'.$user->id.',user_id'

添加额外的条件查询

你也可以指定更多的条件查询:

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

在上面的约束中,只有 account_id 为 1 的行会被约束进行检查。

url

验证的字段必须符合 PHP filter_var 方法验证的有效 URL。

添加约束条件

在一些场景中,你会希望只有字段出现在了输入数组中时才会对其进行验证。你可以在约束列中添加 sometimes 约束来快速的完成指定:

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

这上面的例子中,只有 $data 中提供了 email 字段,email 的约束才会对其进行验证。

复杂的验证条件

有时候,你可能会希望基于更复杂的条件逻辑去进行约束的验证。比如,你希望只有另外一个字段拥有比 100 更大的值时才会验证给定的字段是否被提供。又或者你想要在只有另外一个字段被提供时才会需要其他两个字段的值。添加这些条件判定并非是痛苦的一件事。首先,你还是需要创建一个 Validator 实例和一些静态的约束:

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

让我们假定我们的应用是服务于一些游戏收藏家的。如果一个游戏收藏家注册了我们的应用,并且它们添加了超过 100 个游戏时。我们需要它们解释一下为什么他会拥有那么多的游戏。比如,或许他开了一个游戏贩卖超市,又或者他仅仅就是喜欢收藏。我们可以使用 Validator 实例上的 sometimes 方法来添加这个必要的条件:

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

传递到 sometimes 方法的第一个参数是我们需要考虑验证的字段的名字。第二个参数是我们想要添加的约束。如果第三个参数传递的 Closure 返回的结果是 true,那么这个约束就会被添加进去。这就可以轻松的对复杂的验证场景进行条件的构建。你甚至可以一次性的添加多个字段的条件验证:

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

注意:传递到 Closure 中的 $input 是一个 Illuminate\Support\Flument 实例,并且它可以被用来访问你的输入和文件。

自定义验证约束

Laravel 提供了各种有用的验证约束。但是,你可能希望添加你自己的特定的约束。你可以使用 Validator 假面的extend 方法来注册自己的验证约束。让我们在服务提供者里注册一个自定义的验证约束:

<?phpnamespace App\Providers;use Validator;use Illuminate\Support\ServiceProvider;class AppServiceProvider extends ServiceProvider{  /**
   * Bootstrap any application services.
   *
   * @return void
   */
   public function boot()
   {
     Validator::extend('foo', function ($attribute, $value, $parameters, $validator) {       return $value == 'foo';
     });
   }   /**
    * Register the service provider.
    *
    * @return void
    */
    public function register()
    {      //
    }
}

自定义的验证闭包中接收四个参数:需要被验证的属性名称,属性的值,一个需要被传递到约束的 $paramters 数组,和 Validator 实例。

你也可以传递一个类名和方法到 extend 方法中来代替闭包:

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

隐式的扩展

默认的,当属性被验证时,如果在输入数组中没有被提供,或者验证约束为 required 却是一个空值。那么普通的验证约束,包括自定义的约束扩展,都不会再执行。比如,unique 约束就不会在出现 null 值进行执行:

$rules = ['name' => 'unique'];$input = ['name' => null];

Validator:make($input, $rules)->passes(); // true

如果需要约束即使是属性值为空时也继续执行,那么约束需要暗示属性是必须的。你可以使用Validator::extendImplicit() 方法来构建一个 “隐式的” 扩展:

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

注意: 隐式的扩展仅仅是暗示属性是必须的,不论它实际上是缺失的值或者是空的属性,这都取决于你。