Validation

Introduction

验证可用于交叉检查数据并通过将数据提供给Validator 班级。验证与Validator 类可用于表单提交、查询字符串数据和其他来源,以及模型验证(请参见下面的注释)。文档的这一部分解释了如何使用Validator 在您的项目中定位、自定义和执行验证的类。

本节用于详细验证Validator 班级。通过特征处理验证模型的方式略有不同。请参阅验证特征 部分了解有关验证模型的更多信息。

基本用法

验证器类是一个简单、方便的工具,用于验证数据和通过Validator 班级。

基本验证示例

$validator = Validator::make(
    ['name' => 'Joe'],
    ['name' => 'required|min:5']
);

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

使用数组指定规则

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

$validator = Validator::make(
    ['name' => 'Joe'],
    ['name' => ['required', 'min:5']]
);

验证多个字段

$validator = Validator::make(
    [
        'name' => 'Joe',
        'password' => 'lamepassword',
        'email' => 'email@example.com'
    ],
    [
        'name' => 'required',
        'password' => 'required|min:8',
        'email' => 'required|email|unique:users'
    ]
);

一旦Validator 实例已经创建,fails (或者passes) 方法可用于执行验证。

if ($validator->fails()) {
    // The given data did not pass validation
}

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

$messages = $validator->messages();

您还可以访问一组失败的验证规则,但没有消息。为此,请使用failed 方法:

$failed = $validator->failed();

验证文件

Validator 类提供了几个验证文件的规则,例如size,mimes, 和别的。验证文件时,您可以简单地将它们与其他数据一起传递给验证器。

使用错误消息

调用后messages 上的方法Validator 例如,您将收到Illuminate\Support\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>');

NOTE: 默认情况下,消息使用 Bootstrap 兼容语法进行格式化。

使用某种格式检索所有错误消息

foreach ($messages->all('<li>:message</li>') as $message) {
    //
}

错误消息和视图

执行验证后,您将需要一种简单的方法将错误消息返回给您的视图。这由 Winter 很方便地处理。以以下路由为例:

public function onRegister()
{
    $rules = [];

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

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

请注意,当验证失败时,我们通过Validator 使用重定向的实例withErrors 方法。此方法会将错误消息闪烁到会话中,以便它们在下一个请求中可用。

Winter 将始终检查会话数据中的错误,并在它们可用时自动将它们绑定到视图。因此,重要的是要注意errors 每次请求时,变量将始终在您的所有页面中可用,让您方便地假设errors 变量总是被定义并且可以安全地使用。这errors 变量将是一个实例MessageBag.

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

{{ errors.first('email') }}

命名错误包

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

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

然后您可以访问指定的MessageBag 实例来自$errors 多变的:

{{ errors.login.first('email') }}

可用的验证规则

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

- [Accepted](#rule-accepted) - [Active URL](#rule-active-url) - [After (Date)](#rule-after) - [Alpha](#rule-alpha) - [Alpha Dash](#rule-alpha-dash) - [Alpha Numeric](#rule-alpha-num) - [Array](#rule-array) - [Before (Date)](#rule-before) - [Between](#rule-between) - [Boolean](#rule-boolean) - [Confirmed](#rule-confirmed) - [Date](#rule-date) - [Date Format](#rule-date-format) - [Different](#rule-different) - [Digits](#rule-digits) - [Digits Between](#rule-digits-between) - [E-Mail](#rule-email) - [Exists (Database)](#rule-exists) - [Image (File)](#rule-image) - [In](#rule-in) - [Integer](#rule-integer) - [IP Address](#rule-ip) - [Max](#rule-max) - [MIME Types](#rule-mimes) - [Min](#rule-min) - [Not In](#rule-not-in) - [Nullable](#rule-nullable) - [Numeric](#rule-numeric) - [Regular Expression](#rule-regex) - [Required](#rule-required) - [Required If](#rule-required-if) - [Required With](#rule-required-with) - [Required With All](#rule-required-with-all) - [Required Without](#rule-required-without) - [Required Without All](#rule-required-without-all) - [Same](#rule-same) - [Size](#rule-size) - [String](#rule-string) - [Timezone](#rule-timezone) - [Unique (Database)](#rule-unique) - [URL](#rule-url)

accepted

验证中的字段必须是yes,on, 或者1.这对于验证“服务条款”接受度很有用。

active_url

验证字段必须是有效的 URLcheckdnsrr PHP函数。

after:date

验证字段必须是给定日期之后的值。日期将被传递到 PHPstrtotime功能。

alpha

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

alpha_dash

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

alpha_num

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

array

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

before:date

验证字段必须是给定日期之前的值。日期将被传递到 PHPstrtotime 功能。

between:min,max

验证字段的大小必须介于给定的minmax.字符串、数字和文件的计算方式与size 规则。

boolean

验证中的字段必须能够转换为布尔值。接受的输入是true,false,1,0,"1""0".

confirmed

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

date

验证字段必须是有效日期strtotime PHP函数。

date_format:format

验证中的字段必须匹配format 根据定义date_parse_from_format PHP函数。

different:field

给定的field 必须不同于验证中的字段。

digits:value

验证中的字段必须是numeric 并且必须有一个确切的长度value.

digits_between:min,max

验证字段的长度必须介于给定的minmax.

email

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

exists:table,column

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

存在规则的基本用法

'state' => 'exists:states'

指定自定义列名称

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

您还可以指定更多条件,这些条件将作为“where”子句添加到查询中:

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

通过NULL 作为“where”子句值将添加一个检查NULL 数据库值:

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

image

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

in:foo,bar,...

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

integer

验证字段必须有一个整数值。

ip

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

max:value

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

mimes:foo,bar,...

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

MIME规则的基本用法

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

min:value

正在验证的字段必须至少有value.字符串、数字和文件的计算方式与size 规则。

not_in:foo,bar,...

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

nullable

正在验证的字段可能是null.这在验证原语时特别有用,例如可以包含的字符串和整数null 值。

numeric

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

regex:pattern

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

Note: 当使用regex 模式,可能需要在数组中指定规则而不是使用竖线定界符,尤其是当正则表达式包含竖线字符时。

required

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

required_if:field,value,...

如果field 字段等于任何value.

required_with:foo,bar,...

验证字段必须存在除非 存在任何其他指定字段。

required_with_all:foo,bar,...

验证字段必须存在除非 所有其他指定的字段都存在。

required_without:foo,bar,...

验证字段必须存在只有当 任何其他指定的字段都不存在。

required_without_all:foo,bar,...

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

same:field

指定的field 值必须与验证中的字段值相匹配。

size:value

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

string:value

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

timezone

验证字段必须是有效的时区标识符timezone_identifiers_list PHP函数。

unique:table,column,except,idColumn

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

唯一规则的基本用法

'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_id1 将包含在独特的支票中。

url

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

NOTE: 这个函数使用 PHP 的filter_var 方法。

有条件地添加规则

在某些情况下,您可能希望对字段运行验证检查only 如果该字段存在于输入数组中。要快速完成此操作,请添加sometimes 规则到您的规则列表:

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

在上面的例子中,email 字段只有在存在于$data 大批。

复杂的条件验证

有时您可能希望仅当另一个字段的值大于 100 时才需要给定字段。或者您可能需要两个字段只有在另一个字段存在时才具有给定值。添加这些验证规则并不一定很痛苦。首先,创建一个Validator 与你的实例静态规则 永远不会改变:

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

假设我们的 Web 应用程序适用于游戏收藏家。如果游戏收藏家在我们的应用程序中注册并且他们拥有 100 多款游戏,我们希望他们解释为什么他们拥有这么多游戏。例如,也许他们经营一家游戏转售店,或者他们可能只是喜欢收集。要有条件地添加此要求,我们可以使用sometimes 上的方法Validator 实例。

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

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

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

NOTE:$input 传递给你的参数Closure 将是一个实例Illuminate\Support\Fluent 并且可以用作访问您的输入和文件的对象。

验证数组

验证基于数组的表单输入字段并不一定很痛苦。您可以使用“点符号”来验证数组中的属性。例如,如果传入的 HTTP 请求包含photos[profile] 字段,您可以像这样验证它:

$validator = Validator::make(Input::all(), [
    'photos.profile' => 'required|image',
]);

您还可以验证数组的每个元素。例如,要验证给定数组输入字段中的每封电子邮件都是唯一的,您可以执行以下操作:

$validator = Validator::make(Input::all(), [
    'person.*.email' => 'email|unique:users',
    'person.*.first_name' => 'required_with:person.*.last_name',
]);

同样,您可以使用* 在语言文件中指定验证消息时的字符,使得对基于数组的字段使用单个验证消息变得轻而易举:

'custom' => [
    'person.*.email' => [
        'unique' => 'Each person must have a unique e-mail address',
    ]
],

如果愿意,您也可以在验证规则中使用“数组表示法”。这些规则将在验证时自动转换为“点符号”。

$validator = Validator::make(Input::all(), [
    'photos[profile]' => 'required|image',
    'person[][email]' => 'email|unique:users',
]);

自定义错误消息

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

将自定义消息传递给验证器

$messages = [
    'required' => 'The :attribute field is required.',
];

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

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

其他验证占位符

$messages = [
    '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 = [
    'email.required' => 'We need to know your e-mail address!',
];

在语言文件中指定自定义消息

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

return  [
    'required' => 'We need to know your e-mail address!',
    'email.required' => 'We need to know your e-mail address!',
];

然后在你的电话中Validator::make 使用Lang:get 使用您的自定义文件。

Validator::make($formValues, $validations, Lang::get('acme.blog::validation'));

自定义验证规则

注册自定义验证规则

有多种有用的验证规则;但是,您可能希望指定一些您自己的。

注册自定义验证规则的最简单方法是添加registerValidationRules() : array 中的方法Plugin.php 注册文件 为您的插件。此方法应返回一个数组,其中键是验证器规则名称,值是扩展的类Winter\Storm\Validation\Rule 或可调用函数。可调用函数接收四个参数,$attribute 被验证,该$value 的属性和数组$parameters 传递给规则,并且$validator实例。

public function registerValidationRules()
{
    return [
        'be_like_bob' => \Winter\Tester\Rules\BeLikeBobRule::class,
        'uppercase' => function ($attribute, $value, $parameters, $validator) {
            return strtoupper($value) === $value;
        },
    ];
}

注册自定义验证规则的另一种方法是通过扩展 Validator 实例extend 方法。在 Winter CMS 插件中,这可以添加到boot() 你里面的回调方法Plugin.php 注册文件。

您可以使用自定义验证规则扩展 Validator 实例作为Closure, 或者作为Rule 目的。

使用闭包

如果您只需要在整个插件或应用程序中指定一次自定义规则的功能,您可以使用闭包来定义规则。第一个参数定义规则的名称,第二个参数提供闭包。

use Validator;

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

自定义验证器 Closure 接收三个参数:$attribute 被验证,该$value 的属性,以及一个数组$parameters 传递给规则。

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

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

使用自定义规则扩展验证器后,您需要将其添加到规则定义中。例如,您可以将其添加到$rules 你的模型数组。

public $rules = [
    'field' => 'foo'
];

使用规则对象

ARule object 代表您的模型的单个可重用验证规则Illuminate\Contracts\Validation\Rule 合同。每个规则对象必须提供三个方法:passes 确定给定值是否通过验证的方法和message 定义默认回退错误消息的方法。Rule 对象应该扩展Winter\Storm\Validation\Rule 抽象的。

<?php
use Winter\Storm\Validation\Rule;

class Uppercase extends Rule
{
    /**
     * Determine if the validation rule passes.
     *
     * @param  string  $attribute
     * @param  mixed  $value
     * @return bool
     */
    public function passes($attribute, $value)
    {
        return strtoupper($value) === $value;
    }

    /**
     * Get the validation error message.
     *
     * @return string
     */
    public function message()
    {
        return 'The :attribute must be uppercase.';
    }
}

要使用您的规则对象扩展验证器,您可以向验证器提供该类的实例extend 方法:

Validator::extend('uppercase', Uppercase::class);

Rule 对象应该存储在/rules 插件目录中的子目录。

定义错误信息

您还需要为自定义规则定义一条错误消息。

Rule 对象,您可以通过提供一个message 返回字符串的方法。该字符串可以是语言字符串,这将允许根据需要翻译消息。

创建自定义验证规则时,您有时可能需要为错误消息定义自定义占位符替换。您可以致电replacer Validator facade 上的方法。您也可以在boot 你的插件的方法。

public function boot()
{
    Validator::replacer('foo', function ($message, $attribute, $rule, $parameters) {
        // return a message as a string
    });
}

回调接收 4 个参数:$message 作为验证器返回的消息,$attribute 作为验证失败的属性,$rule 作为规则对象和$parameters 是用验证规则定义的参数。例如,您可以将列名称注入到参数中定义的消息中:

public function boot()
{
    Validator::replacer('foo', function ($message, $attribute, $rule, $parameters) {
        return str_replace(':column', $parameters[0], $message);
    });
}

注册自定义验证器解析器

如果您希望为您的应用程序提供大量自定义规则,您还可以定义一个验证器解析器。请注意,每个 Validation 实例只能定义一个解析器,因此不建议在插件中定义解析器,除非您使用自己的 Validation 实例而不是全局 Validator facade。

要定义解析器,您可以向resolver Validator 外观中的方法。

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

解析器中支持的每个规则都使用validateXXX 方法。例如,foo 验证规则会寻找一个名为validateFoo.这validate 方法应该返回一个布尔值是否给定$value 通过验证。

public function validateFoo($attribute, $value, $parameters)
{
    // return whether the value passes validation
}

与验证器一样replacer 方法,您有时可能需要为错误消息定义自定义占位符替换。您可以在解析器中通过定义一个replaceXXX 方法。

protected function replaceFoo($message, $attribute, $rule, $parameters)
{
    return str_replace(':foo', $parameters[0], $message);
}
豫ICP备18041297号-2