9 个粉丝

核心验证器

Yii 提供了一套常用的核心验证器,主要位于 yii\validators 命名空间下。您可以使用 *别名* 来指定这些核心验证器的使用,而不是使用冗长的验证器类名。例如,您可以使用别名 required 来引用 yii\validators\RequiredValidator

public function rules()
{
    return [
        [['email', 'password'], 'required'],
    ];
}

yii\validators\Validator::$builtInValidators 属性声明了所有支持的验证器别名。

在下文中,我们将描述每个核心验证器的主要用法和属性。

boolean

[
    // checks if "selected" is either 0 or 1, regardless of data type
    ['selected', 'boolean'],

    // checks if "deleted" is of boolean type, either true or false
    ['deleted', 'boolean', 'trueValue' => true, 'falseValue' => false, 'strict' => true],
]

此验证器检查输入值是否为布尔值。

  • trueValue:表示 true 的值。默认为 '1'
  • falseValue:表示 false 的值。默认为 '0'
  • strict:输入值的类型是否应与 trueValuefalseValue 的类型匹配。默认为 false

注意:由于通过 HTML 表单提交的数据输入都是字符串,因此您通常应将 strict 属性保留为 false

captcha

[
    ['verificationCode', 'captcha'],
]

此验证器通常与 yii\captcha\CaptchaActionyii\captcha\Captcha 一起使用,以确保输入与 CAPTCHA 小部件显示的验证码相同。

  • caseSensitive:验证码比较是否区分大小写。默认为 false
  • captchaAction:对应于呈现 CAPTCHA 图像的 CAPTCHA 操作路由。默认为 'site/captcha'
  • skipOnEmpty:如果输入为空,是否可以跳过验证。默认为 false,这意味着输入是必需的。

compare

[
    // validates if the value of "password" attribute equals to that of "password_repeat"
    ['password', 'compare'],

    // same as above but with explicitly specifying the attribute to compare with
    ['password', 'compare', 'compareAttribute' => 'password_repeat'],

    // validates if age is greater than or equal to 30
    ['age', 'compare', 'compareValue' => 30, 'operator' => '>=', 'type' => 'number'],
]

此验证器将指定的输入值与另一个值进行比较,并确保它们之间的关系是否与 operator 属性指定的相同。

  • compareAttribute:应与之比较的属性的名称。当验证器用于验证属性时,此属性的默认值为属性名称后缀为 _repeat。例如,如果要验证的属性是 password,那么此属性将默认为 password_repeat
  • compareValue: 要与输入值进行比较的常量值(或返回值的闭包)。当此属性和 compareAttribute 都被指定时,此属性将优先。
  • operator: 比较运算符。默认为 ==,表示检查输入值是否等于 compareAttributecompareValue 的值。支持以下运算符
    • ==: 检查两个值是否相等。比较是在非严格模式下进行的。
    • ===: 检查两个值是否相等。比较是在严格模式下进行的。
    • !=: 检查两个值是否不相等。比较是在非严格模式下进行的。
    • !==: 检查两个值是否不相等。比较是在严格模式下进行的。
    • >: 检查被验证的值是否大于被比较的值。
    • >=: 检查被验证的值是否大于或等于被比较的值。
    • <: 检查被验证的值是否小于被比较的值。
    • <=: 检查被验证的值是否小于或等于被比较的值。
  • type: 默认的比较类型为 'string',这意味着值逐字节比较。当比较数字时,请确保将 $type 设置为 'number' 以启用数字比较。

比较日期值

比较验证器只能用于比较字符串和数字。如果您需要比较日期之类的值,您有两个选择。要将日期与固定值进行比较,您可以简单地使用 date 验证器并指定其 $min$max 属性。如果您需要比较表单中输入的两个日期,例如 fromDatetoDate 字段,您可以使用比较验证器和日期验证器的组合,如下所示

['fromDate', 'date', 'timestampAttribute' => 'fromDate'],
['toDate', 'date', 'timestampAttribute' => 'toDate'],
['fromDate', 'compare', 'compareAttribute' => 'toDate', 'operator' => '<', 'enableClientValidation' => false],

由于验证器按指定的顺序执行,因此这将首先验证 fromDatetoDate 中输入的值是否为有效的日期值,如果是,它们将被转换为机器可读格式。之后,这两个值将使用比较验证器进行比较。客户端验证未启用,因为这只会对服务器端有效,因为日期验证器当前不提供客户端验证,所以 $enableClientValidation 也在比较验证器上设置为 false

date

date 验证器有三种不同的快捷方式

[
    [['from_date', 'to_date'], 'date'],
    [['from_datetime', 'to_datetime'], 'datetime'],
    [['some_time'], 'time'],
]

此验证器检查输入值是否为以正确格式显示的日期、时间或日期时间。可选地,它可以将输入值转换为 UNIX 时间戳或其他机器可读格式,并将其存储在通过 timestampAttribute 指定的属性中。

  • format: 被验证的值应采用的日期/时间格式。这可以是 ICU 手册 中描述的日期时间模式。或者,这可以是一个以 php: 为前缀的字符串,代表 PHP Datetime 类可以识别的格式。有关支持的格式,请参考 https://php.ac.cn/manual/en/datetime.createfromformat.php。如果未设置,它将采用 Yii::$app->formatter->dateFormat 的值。有关更多详细信息,请参见 API 文档

  • timestampAttribute: 此验证器可以将从输入日期/时间转换的 UNIX 时间戳分配到的属性的名称。这可以与正在验证的属性相同。如果是这种情况,原始值将在验证后被时间戳值覆盖。有关用法示例,请参见 "使用 DatePicker 处理日期输入"

    从 2.0.4 版本开始,可以使用 $timestampAttributeFormat$timestampAttributeTimeZone 为此属性指定格式和时区。

    注意,当使用 timestampAttribute 时,输入值将被转换为 unix 时间戳,该时间戳根据定义是 UTC 时间,因此将执行从 输入时区 到 UTC 的转换(此行为可以通过设置 $defaultTimeZone 自 2.0.39 版本起改变)。

  • 从 2.0.4 版本开始,还可以指定 最小最大 时间戳。

如果输入是可选的,您可能还想在日期验证器之外添加 默认值过滤器 以确保空输入存储为 null。否则,您可能会在数据库中遇到 0000-00-00 之类的日期,或在日期选择器的输入字段中遇到 1970-01-01 之类的日期。

[
    [['from_date', 'to_date'], 'default', 'value' => null],
    [['from_date', 'to_date'], 'date'],
],

default

[
    // set "age" to be null if it is empty
    ['age', 'default', 'value' => null],

    // set "country" to be "USA" if it is empty
    ['country', 'default', 'value' => 'USA'],

    // assign "from" and "to" with a date 3 days and 6 days from today, if they are empty
    [['from', 'to'], 'default', 'value' => function ($model, $attribute) {
        return date('Y-m-d', strtotime($attribute === 'to' ? '+3 days' : '+6 days'));
    }],
]

此验证器不验证数据。相反,如果被验证的属性为空,它会将默认值分配给被验证的属性。

  • value: 默认值或作为回调的闭包,该回调返回将被分配给被验证的属性的默认值(如果它们为空)。闭包的签名应如下所示:
function foo($model, $attribute) {
    // ... compute $value ...
    return $value;
}

信息:如何确定值是否为空是一个单独的主题,在 空值 部分中介绍。数据库架构中的默认值可以通过模型的 loadDefaultValues() 方法加载。

double

[
    // checks if "salary" is a double number
    ['salary', 'double'],
]

此验证器检查输入值是否为双精度数。它等效于 number 验证器。

  • max: 值的上限(含)。如果未设置,则表示验证器不检查上限。
  • min: 值的下限(含)。如果未设置,则表示验证器不检查下限。

each

信息:此验证器从 2.0.4 版本开始可用。

[
    // checks if every category ID is an integer
    ['categoryIDs', 'each', 'rule' => ['integer']],
]

此验证器仅适用于数组属性。它验证数组的每个元素是否都能通过指定的验证规则成功验证。在上面的示例中,categoryIDs 属性必须取数组值,并且每个数组元素将通过 integer 验证规则进行验证。

  • rule: 指定验证规则的数组。数组中的第一个元素指定验证器的类名或别名。数组中其余的名称-值对用于配置验证器对象。
  • allowMessageFromRule: 是否使用嵌入式验证规则返回的错误消息。默认为 true。如果为 false,它将使用 message 作为错误消息。

注意:如果属性值不是数组,则认为验证失败,message 将作为错误消息返回。

email

[
    // checks if "email" is a valid email address
    ['email', 'email'],
]

此验证器检查输入值是否为有效的电子邮件地址。

  • allowName: 是否允许电子邮件地址中的名称(例如 John Smith <[email protected]>)。默认为 false
  • checkDNS: 是否检查电子邮件的域是否存在并具有 A 或 MX 记录。请注意,此检查可能会因 DNS 问题而失败,即使电子邮件地址实际上有效。默认为 false
  • enableIDN: 验证过程是否应考虑 IDN(国际化域名)。默认为 false。请注意,要使用 IDN 验证,您必须安装并启用 intl PHP 扩展,否则将抛出异常。

exist

[
    // a1 needs to exist in the column represented by the "a1" attribute
    // i.e. a1 = 1, valid if there is value 1 in column "a1"
    ['a1', 'exist'],
    // equivalent of
    ['a1', 'exist', 'targetAttribute' => 'a1'],
    ['a1', 'exist', 'targetAttribute' => ['a1' => 'a1']],

    // a1 needs to exist, but its value will use a2 to check for the existence
    // i.e. a1 = 2, valid if there is value 2 in column "a2"
    ['a1', 'exist', 'targetAttribute' => 'a2'],
    // equivalent of
    ['a1', 'exist', 'targetAttribute' => ['a1' => 'a2']],
    
    // a2 needs to exist, its value will use a2 to check for the existence, a1 will receive error message
    // i.e. a2 = 2, valid if there is value 2 in column "a2"
    ['a1', 'exist', 'targetAttribute' => ['a2']],
    // equivalent of
    ['a1', 'exist', 'targetAttribute' => ['a2' => 'a2']],

    // a1 and a2 need to exist together, and the first attribute without errors will receive error message
    // i.e. a1 = 3, a2 = 4, valid if there is value 3 in column "a1" and value 4 in column "a2"
    [['a1', 'a2'], 'exist', 'targetAttribute' => ['a1', 'a2']],
    // equivalent of
    [['a1', 'a2'], 'exist', 'targetAttribute' => ['a1' => 'a1', 'a2' => 'a2']],

    // a1 and a2 need to exist together, only a1 will receive error message
    // i.e. a1 = 5, a2 = 6, valid if there is value 5 in column "a1" and value 6 in column "a2"
    ['a1', 'exist', 'targetAttribute' => ['a1', 'a2']],
    // equivalent of
    ['a1', 'exist', 'targetAttribute' => ['a1' => 'a1', 'a2' => 'a2']],

    // a1 needs to exist by checking the existence of both a2 and a3 (using a1 value)
    // i.e. a1 = 7, a2 = 8, valid if there is value 7 in column "a3" and value 8 in column "a2"
    ['a1', 'exist', 'targetAttribute' => ['a2', 'a1' => 'a3']],
    // equivalent of
    ['a1', 'exist', 'targetAttribute' => ['a2' => 'a2', 'a1' => 'a3']],

    // a1 needs to exist. If a1 is an array, then every element of it must exist.
    // i.e. a1 = 9, valid if there is value 9 in column "a1"
    //      a1 = [9, 10], valid if there are values 9 and 10 in column "a1"
    ['a1', 'exist', 'allowArray' => true],
    
    // type_id needs to exist in the column "id" in the table defined in ProductType class
    // i.e. type_id = 1, valid if there is value 1 in column "id" of ProductType's table
    ['type_id', 'exist', 'targetClass' => ProductType::class, 'targetAttribute' => ['type_id' => 'id']],    
    
    // the same as the previous, but using already defined relation "type"
    ['type_id', 'exist', 'targetRelation' => 'type'],
]

此验证器检查输入值是否可以在由 活动记录 属性表示的表列中找到。您可以使用 targetAttribute 指定 活动记录 属性,并使用 targetClass 指定相应的 活动记录 类。如果您没有指定它们,它们将采用正在验证的属性和模型类的值。

您可以使用此验证器来验证单个列或多个列(即,多个属性值的组合应该存在)。如果在同时检查多个列时(例如示例中的 ['a1', 'a2'])验证失败,并且 skipOnError 设置为 true,则只有没有先前错误的第一个属性将收到新的错误消息。

  • targetClass: 活动记录 类的名称,应使用它来查找正在验证的输入值。如果未设置,将使用当前正在验证的模型的类。
  • targetAttribute: targetClass 中的属性的名称,应使用它来验证输入值的存在。如果未设置,它将使用当前正在验证的属性的名称。您可以使用数组来验证多个列的同时存在。数组值是将用于验证存在的属性,而数组键是将要验证其值的属性。如果键和值相同,则可以只指定值。
    假设我们要验证 ModelA 并将 ModelB 设置为目标类,那么以下 targetAttribute 的配置将被视为
    • null => 将检查当前验证的 ModelA 属性的值与存储的 ModelB 同名属性的值。
    • 'a' => 将检查当前验证的 ModelA 属性的值与存储的 ModelB 的 "a" 属性的值。
    • ['a'] => 将检查 ModelA 的 "a" 属性的值与存储的 ModelB 的 "a" 属性的值。
    • ['a' => 'a'] => 与上面相同
    • ['a', 'b'] => 将检查 ModelA 的 "a" 属性的值与存储的 ModelB 的 "a" 属性的值,同时检查 ModelA 的 "b" 属性的值与存储的 ModelB 的 "b" 属性的值。
    • ['a' => 'b'] => 将检查 ModelA 的 "a" 属性的值与存储的 ModelB 的 "b" 属性的值。
  • targetRelation: 从 2.0.14 版本开始,您可以使用方便的属性 targetRelation,它使用来自请求关系的规范覆盖 targetClasstargetAttribute 属性。
  • filter: 将应用于用于检查输入值是否存在 的 DB 查询的附加过滤器。这可以是字符串,也可以是表示附加查询条件的数组(有关查询条件格式,请参阅 yii\db\Query::where()),也可以是具有 function ($query) 签名的匿名函数,其中 $query 是您可以修改的 Query 对象。
  • allowArray: 是否允许输入值为数组。默认为 false。如果此属性为 true 且输入为数组,则数组的每个元素都必须存在于目标列中。请注意,如果您通过将 targetAttribute 设置为数组来验证多个列,则不能将此属性设置为 true

file

[
    // checks if "primaryImage" is an uploaded image file in PNG, JPG or GIF format.
    // the file size must be less than 1MB
    ['primaryImage', 'file', 'extensions' => ['png', 'jpg', 'gif'], 'maxSize' => 1024*1024],
]

此验证器检查输入是否为有效的上传文件。

  • extensions: 允许上传的文件扩展名列表。可以是数组或由空格或逗号分隔的文件扩展名组成的字符串(例如“gif, jpg”)。扩展名不区分大小写。默认为null,表示允许所有文件扩展名。
  • mimeTypes: 允许上传的文件 MIME 类型列表。可以是数组或由空格或逗号分隔的文件 MIME 类型组成的字符串(例如“image/jpeg, image/png”)。可以使用带有特殊字符*的通配符掩码来匹配 MIME 类型组。例如,image/*将通过所有以image/开头的 MIME 类型(例如image/jpegimage/png)。MIME 类型名称不区分大小写。默认为null,表示允许所有 MIME 类型。有关更多详细信息,请参阅通用媒体类型
  • minSize: 上传文件所需的最小字节数。默认为null,表示没有下限。
  • maxSize: 上传文件允许的最大字节数。默认为null,表示没有上限。
  • maxFiles: 给定属性可以容纳的最大文件数。默认为 1,表示输入必须是单个上传文件。如果大于 1,则输入必须是包含最多maxFiles个上传文件的数组。
  • checkExtensionByMimeType: 是否根据文件的 MIME 类型检查文件扩展名。如果 MIME 类型检查生成的扩展名与上传的文件扩展名不同,则该文件将被视为无效。默认为true,表示执行此类检查。

FileValidatoryii\web\UploadedFile一起使用。有关上传文件和执行上传文件验证的完整说明,请参阅上传文件部分。

filter

[
    // trim "username" and "email" inputs
    [['username', 'email'], 'filter', 'filter' => 'trim', 'skipOnArray' => true],

    // normalize "phone" input
    ['phone', 'filter', 'filter' => function ($value) {
        // normalize phone input here
        return $value;
    }],
    
    // normalize "phone" using the function "normalizePhone"
    ['phone', 'filter', 'filter' => [$this, 'normalizePhone']],
    
    public function normalizePhone($value) {
        return $value;
    }
]

此验证器不验证数据。相反,它对输入值应用过滤器并将其重新分配给正在验证的属性。

  • filter: 定义过滤器的 PHP 回调。这可以是全局函数名、匿名函数等。函数签名必须是function ($value) { return $newValue; }。此属性必须设置。
  • skipOnArray: 如果输入值是数组,是否跳过过滤器。默认为false。请注意,如果过滤器无法处理数组输入,您应该将此属性设置为true。否则,可能会发生一些 PHP 错误。

提示:如果您想修剪输入值,可以直接使用trim验证器。

提示:许多 PHP 函数都具有filter回调所需的签名。例如,要应用类型转换(使用例如intvalboolval,...)以确保属性的特定类型,您可以简单地指定过滤器的函数名称,而无需将它们包装在闭包中

['property', 'filter', 'filter' => 'boolval'],
['property', 'filter', 'filter' => 'intval'],

image

[
    // checks if "primaryImage" is a valid image with proper size
    ['primaryImage', 'image', 'extensions' => 'png, jpg',
        'minWidth' => 100, 'maxWidth' => 1000,
        'minHeight' => 100, 'maxHeight' => 1000,
    ],
]

此验证器检查输入值是否表示有效的图像文件。它从file验证器扩展而来,因此继承了它所有的属性。此外,它还支持以下专门用于图像验证目的的附加属性

  • minWidth: 图像的最小宽度。默认为null,表示没有下限。
  • maxWidth: 图像的最大宽度。默认为null,表示没有上限。
  • minHeight: 图像的最小高度。默认为null,表示没有下限。
  • maxHeight: 图像的最大高度。默认为null,表示没有上限。

ip

[
    // checks if "ip_address" is a valid IPv4 or IPv6 address
    ['ip_address', 'ip'],

    // checks if "ip_address" is a valid IPv6 address or subnet,
    // value will be expanded to full IPv6 notation.
    ['ip_address', 'ip', 'ipv4' => false, 'subnet' => null, 'expandIPv6' => true],

    // checks if "ip_address" is a valid IPv4 or IPv6 address,
    // allows negation character `!` at the beginning
    ['ip_address', 'ip', 'negation' => true],
]

验证器检查属性值是否为有效的 IPv4/IPv6 地址或子网。如果启用了规范化或 IPv6 扩展,它也可能更改属性的值。

验证器具有以下配置选项

  • ipv4: 验证的值是否可以是 IPv4 地址。默认为true
  • ipv6: 验证的值是否可以是 IPv6 地址。默认为true
  • subnet: 地址是否可以是带有 CIDR 子网的 IP,例如192.168.10.0/24

    • true - 需要子网,没有 CIDR 的地址将被拒绝
    • false - 地址不能有 CIDR
    • null - CIDR 是可选的

    默认为false

  • normalize: 是否向没有 CIDR 的地址添加具有最小长度的 CIDR 前缀(IPv4 为 32,IPv6 为 128)。仅当subnet不为false时才有效。例如

    • 10.0.1.5将被规范化为10.0.1.5/32
    • 2008:db0::1将被规范化为2008:db0::1/128

    默认为false

  • negation: 验证地址是否可以在开头有一个否定字符!。默认为false
  • expandIPv6: 是否将 IPv6 地址扩展到完整表示法格式。例如,2008:db0::1将扩展为2008:0db0:0000:0000:0000:0000:0000:0001。默认为false
  • ranges: 允许或禁止的 IPv4 或 IPv6 范围数组。

    当数组为空或未设置此选项时,所有 IP 地址都允许。否则,将按顺序检查规则,直到找到第一个匹配项。IP 地址被禁止,因为它没有匹配任何规则。

    例如:`php [

       'client_ip', 'ip', 'ranges' => [
           '192.168.10.128'
           '!192.168.10.0/24',
           'any' // allows any other IP addresses
       ]
    

    ] ` 在此示例中,除192.168.10.0/24子网以外,所有 IPv4 和 IPv6 地址都允许访问。IPv4 地址192.168.10.128也允许,因为它在限制之前列出。

  • networks: 可以在ranges中使用的网络别名数组。数组格式

    • 键 - 别名名称
    • 值 - 字符串数组。字符串可以是范围、IP 地址或其他别名。字符串可以用!(独立于negation选项)取反。

    默认情况下定义了以下别名

    • *: any
    • any: 0.0.0.0/0, ::/0
    • private: 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, fd00::/8
    • multicast: 224.0.0.0/4, ff00::/8
    • linklocal: 169.254.0.0/16, fe80::/10
    • localhost: 127.0.0.0/8', ::1
    • documentation: 192.0.2.0/24, 198.51.100.0/24, 203.0.113.0/24, 2001:db8::/32
    • system: multicast, linklocal, localhost, documentation

信息:此验证器自版本 2.0.7 起可用。

in

[
    // checks if "level" is 1, 2 or 3
    ['level', 'in', 'range' => [1, 2, 3]],
]

此验证器检查输入值是否可以在给定值列表中找到。

  • range: 输入值应该在其内查找的给定值列表。
  • strict: 输入值与给定值之间的比较是否应严格(类型和值都必须相同)。默认为false
  • not: 是否应反转验证结果。默认为false。当此属性设置为true时,验证器检查输入值是否不在给定值列表中。
  • allowArray: 是否允许输入值为数组。当这为true且输入值为数组时,数组中的每个元素都必须在给定值列表中找到,否则验证将失败。

integer

[
    // checks if "age" is an integer
    ['age', 'integer'],
]

此验证器检查输入值是否为整数。

  • max: 值的上限(含)。如果未设置,则表示验证器不检查上限。
  • min: 值的下限(含)。如果未设置,则表示验证器不检查下限。

match

[
    // checks if "username" starts with a letter and contains only word characters
    ['username', 'match', 'pattern' => '/^[a-z]\w*$/i']
]

此验证器检查输入值是否与指定的正则表达式匹配。

  • pattern: 输入值应匹配的正则表达式。此属性必须设置,否则将抛出异常。
  • not: 是否反转验证结果。默认为false,表示仅当输入值与模式匹配时,验证才成功。如果设置为true,则仅当输入值不与模式匹配时,验证才被视为成功。

number

[
    // checks if "salary" is a number
    ['salary', 'number'],
]

此验证器检查输入值是否为数字。它等效于double验证器。

  • max: 值的上限(含)。如果未设置,则表示验证器不检查上限。
  • min: 值的下限(含)。如果未设置,则表示验证器不检查下限。

required

[
    // checks if both "username" and "password" are not empty
    [['username', 'password'], 'required'],
]

此验证器检查输入值是否提供且不为空。

  • requiredValue: 输入应该具有的期望值。如果未设置,则表示输入不应为空。
  • strict: 验证值时是否检查数据类型。默认为false。当requiredValue未设置时,如果此属性为true,则验证器将检查输入值是否不严格为null;如果此属性为false,则验证器将使用宽松规则来确定值是否为空。当requiredValue设置后,如果此属性为true,则输入与requiredValue之间的比较也将检查数据类型。

信息:如何确定值是否为空是一个单独的主题,在空值部分中介绍。

safe

[
    // marks "description" to be a safe attribute
    ['description', 'safe'],
]

此验证器不执行数据验证。相反,它用于标记属性为安全属性

string

[
    // checks if "username" is a string whose length is between 4 and 24
    ['username', 'string', 'length' => [4, 24]],
]

此验证器检查输入值是否为具有特定长度的有效字符串。

  • length: 指定要验证的输入字符串的长度限制。可以以以下形式之一指定
    • 整数:字符串应具有的确切长度;
    • 一个元素的数组:输入字符串的最小长度(例如[8])。这将覆盖min
    • 两个元素的数组:输入字符串的最小和最大长度(例如[8, 128])。这将覆盖minmax
  • min: 输入字符串的最小长度。如果未设置,则表示没有最小长度限制。
  • max: 输入字符串的最大长度。如果未设置,则表示没有最大长度限制。
  • encoding: 要验证的输入字符串的编码。如果未设置,它将使用应用程序的字符集值,该值默认为UTF-8

trim

[
    // trims the white spaces surrounding "username" and "email"
    [['username', 'email'], 'trim'],
]

此验证器不执行数据验证。相反,它将修剪输入值周围的空格。请注意,如果输入值是数组,则此验证器将忽略它。

unique

[
    // a1 needs to be unique in the column represented by the "a1" attribute
    // i.e. a1 = 1, valid if there is no value 1 in column "a1"
    ['a1', 'unique'],
    // equivalent of
    ['a1', 'unique', 'targetAttribute' => 'a1'],
    ['a1', 'unique', 'targetAttribute' => ['a1' => 'a1']],

    // a1 needs to be unique, but column a2 will be used to check the uniqueness of the a1 value
    // i.e. a1 = 2, valid if there is no value 2 in column "a2"
    ['a1', 'unique', 'targetAttribute' => 'a2'],
    // equivalent of
    ['a1', 'unique', 'targetAttribute' => ['a1' => 'a2']],

    // a1 and a2 need to be unique together, and the first attribute without errors will receive error message
    // i.e. a1 = 3, a2 = 4, valid if there is no value 3 in column "a1" and at the same time no value 4 in column "a2"
    [['a1', 'a2'], 'unique', 'targetAttribute' => ['a1', 'a2']],
    // equivalent of
    [['a1', 'a2'], 'unique', 'targetAttribute' => ['a1' => 'a1', 'a2' => 'a2']],

    // a1 and a2 need to be unique together, only a1 will receive error message
    ['a1', 'unique', 'targetAttribute' => ['a1', 'a2']],

    // a1 needs to be unique by checking the uniqueness of both a2 and a3 (using a1 value)
    // i.e. a1 = 5, a2 = 6, valid if there is no value 5 in column "a3" and at the same time no value 6 in column "a2"
    ['a1', 'unique', 'targetAttribute' => ['a2', 'a1' => 'a3']],
    
    // type_id needs to be unique in the column "id" in the table defined in ProductType class
    // i.e. type_id = 1, valid if there is no value 1 in column "id" of ProductType's table
    ['type_id', 'unique', 'targetClass' => ProductType::class, 'targetAttribute' => 'id'],    
]

此验证器检查输入值在表列中是否唯一。它仅适用于 Active Record 模型属性。它支持针对单个列或多个列进行验证。如果在同时检查多个列时验证失败(例如示例中的 ['a1', 'a2'])并且 skipOnError 设置为 true,则只有第一个没有先前错误的属性将收到新的错误消息。

  • targetClass: 活动记录 类的名称,应使用它来查找正在验证的输入值。如果未设置,将使用当前正在验证的模型的类。
  • targetAttributetargetClass 中用于验证输入值唯一性的属性名称。如果未设置,它将使用当前正在验证的属性的名称。可以使用数组来同时验证多个列的唯一性。数组值是用于验证唯一性的属性,而数组键是将要验证其值的属性。如果键和值相同,则可以只指定值。
    假设我们要验证 ModelA 并将 ModelB 设置为目标类,那么以下 targetAttribute 的配置将被视为
    • null => 将检查当前验证的 ModelA 属性的值与存储的 ModelB 同名属性的值。
    • 'a' => 将检查当前验证的 ModelA 属性的值与存储的 ModelB 的 "a" 属性的值。
    • ['a'] => 将检查 ModelA 的 "a" 属性的值与存储的 ModelB 的 "a" 属性的值。
    • ['a' => 'a'] => 与上面相同
    • ['a', 'b'] => 将检查 ModelA 的 "a" 属性的值与存储的 ModelB 的 "a" 属性的值,同时检查 ModelA 的 "b" 属性的值与存储的 ModelB 的 "b" 属性的值。
    • ['a' => 'b'] => 将检查 ModelA 的 "a" 属性的值与存储的 ModelB 的 "b" 属性的值。
  • filter:用于检查输入值唯一性的 DB 查询的额外过滤器。这可以是字符串,或表示额外查询条件的数组(关于查询条件格式,请参考 yii\db\Query::where()),或者是一个匿名函数,其签名为 function ($query),其中 $queryQuery 对象,您可以在函数中修改该对象。

url

[
    // checks if "website" is a valid URL. Prepend "http://" to the "website" attribute
    // if it does not have a URI scheme
    ['website', 'url', 'defaultScheme' => 'http'],
]

此验证器检查输入值是否为有效的 URL。

  • validSchemes:一个数组,指定应被视为有效的 URI 方案。默认为 ['http', 'https'],这意味着 httphttps URL 都被视为有效。
  • defaultScheme:如果输入没有方案部分,则将追加到输入的默认 URI 方案。默认为 null,这意味着不修改输入值。
  • enableIDN:验证器是否应该考虑 IDN(国际化域名)。默认为 false。请注意,为了使用 IDN 验证,您必须安装并启用 intl PHP 扩展,否则将抛出异常。

注意:验证器检查 URL 方案和主机部分是否正确。它不会检查 URL 的其余部分,并且没有设计为防止 XSS 或任何其他攻击。有关开发应用程序时威胁预防的更多信息,请参阅 安全最佳实践 文章。

发现错别字或您认为此页面需要改进?
在 github 上编辑它 !