ignitekit/validation

受 Laravel 启发的 PHP 验证包

1.2.0 2022-07-03 21:20 UTC

This package is auto-updated.

Last update: 2024-08-30 01:38:16 UTC


README

Build Status License

受 Laravel 验证启发的 PHP 独立库,用于验证数据

这是一个基于由 Rakit 编写的原始库的分支,并进行了更多改进和更改。

特性

  • 类似 Laravel 验证的 API。
  • 数组验证。
  • $_FILES 验证,支持多个文件。
  • 自定义属性别名。
  • 自定义验证消息。
  • 自定义规则。

要求

  • PHP 7.0 或更高版本
  • Composer 用于安装

快速开始

安装

composer require ignitekit/validation

用法

使用此库验证数据有两种方式。使用 make 创建验证对象,然后使用 validate 进行验证。或者直接使用 validate。示例

使用 make

<?php

require('vendor/autoload.php');

use IgniteKit\Validation\Validator;

$validator = new Validator;

// make it
$validation = $validator->make($_POST + $_FILES, [
    'name'                  => 'required',
    'email'                 => 'required|email',
    'password'              => 'required|min:6',
    'confirm_password'      => 'required|same:password',
    'avatar'                => 'required|uploaded_file:0,500K,png,jpeg',
    'skills'                => 'array',
    'skills.*.id'           => 'required|numeric',
    'skills.*.percentage'   => 'required|numeric'
]);

// then validate
$validation->validate();

if ($validation->fails()) {
    // handling errors
    $errors = $validation->errors();
    echo "<pre>";
    print_r($errors->firstOfAll());
    echo "</pre>";
    exit;
} else {
    // validation passes
    echo "Success!";
}

或直接 validate

<?php

require('vendor/autoload.php');

use IgniteKit\Validation\Validator;

$validator = new Validator;

$validation = $validator->validate($_POST + $_FILES, [
    'name'                  => 'required',
    'email'                 => 'required|email',
    'password'              => 'required|min:6',
    'confirm_password'      => 'required|same:password',
    'avatar'                => 'required|uploaded_file:0,500K,png,jpeg',
    'skills'                => 'array',
    'skills.*.id'           => 'required|numeric',
    'skills.*.percentage'   => 'required|numeric'
]);

if ($validation->fails()) {
	// handling errors
	$errors = $validation->errors();
	echo "<pre>";
	print_r($errors->firstOfAll());
	echo "</pre>";
	exit;
} else {
	// validation passes
	echo "Success!";
}

在这种情况下,上述两个示例将输出相同的结果。

但使用 make,你可以在验证运行之前设置一些内容,例如自定义无效消息、自定义属性别名等。

属性别名

默认情况下,我们将您的属性转换为更易读的文本。例如 confirm_password 将显示为 Confirm password。但您可以使用 setAliassetAliases 方法将其设置为任何您想要的内容。

示例

$validator = new Validator;

// To set attribute alias, you should use `make` instead `validate`.
$validation->make([
	'province_id' => $_POST['province_id'],
	'district_id' => $_POST['district_id']
], [
	'province_id' => 'required|numeric',
	'district_id' => 'required|numeric'
]);

// now you can set aliases using this way:
$validation->setAlias('province_id', 'Province');
$validation->setAlias('district_id', 'District');

// or this way:
$validation->setAliases([
	'province_id' => 'Province',
	'district_id' => 'District'
]);

// then validate it
$validation->validate();

现在如果 province_id 的值为空,错误消息将是 'Province is required'。

自定义验证消息

在注册/设置自定义消息之前,这里有一些您可以在自定义消息中使用的变量

  • :attribute: 将替换为属性别名。
  • :value: 将替换为属性值的字符串化版本。对于数组和对象,将替换为 JSON。

此外,还有一些根据其规则的消息变量。

以下是一些注册/设置您自定义消息的方式

Validator 的自定义消息

使用这种方法,每次您使用 makevalidate 进行验证时,它都会设置您的自定义消息。这对于本地化非常有用。

为此,您可以将自定义消息作为构造函数的第一个参数设置,如下所示

$validator = new Validator([
	'required' => ':attribute harus diisi',
	'email' => ':email tidak valid',
	// etc
]);

// then validation belows will use those custom messages
$validation_a = $validator->validate($dataset_a, $rules_for_a);
$validation_b = $validator->validate($dataset_b, $rules_for_b);

或使用 setMessages 方法如下

$validator = new Validator;
$validator->setMessages([
	'required' => ':attribute harus diisi',
	'email' => ':email tidak valid',
	// etc
]);

// now validation belows will use those custom messages
$validation_a = $validator->validate($dataset_a, $rules_for_dataset_a);
$validation_b = $validator->validate($dataset_b, $rules_for_dataset_b);

验证的自定义消息

有时您可能想要为特定验证设置自定义消息。为此,您可以将自定义消息设置为 $validator->make$validator->validate 的第三个参数,如下所示

$validator = new Validator;

$validation_a = $validator->validate($dataset_a, $rules_for_dataset_a, [
	'required' => ':attribute harus diisi',
	'email' => ':email tidak valid',
	// etc
]);

或您可以使用 $validation->setMessages 如此

$validator = new Validator;

$validation_a = $validator->make($dataset_a, $rules_for_dataset_a);
$validation_a->setMessages([
	'required' => ':attribute harus diisi',
	'email' => ':email tidak valid',
	// etc
]);

...

$validation_a->validate();

特定属性规则的自定义消息

有时您可能想要为特定规则属性设置自定义消息。为此,您可以使用冒号 : 作为消息分隔符或使用链式方法。

示例

$validator = new Validator;

$validation_a = $validator->make($dataset_a, [
	'age' => 'required|min:18'
]);

$validation_a->setMessages([
	'age:min' => '18+ only',
]);

$validation_a->validate();

或使用链式方法

$validator = new Validator;

$validation_a = $validator->make($dataset_a, [
	'photo' => [
		'required',
		$validator('uploaded_file')->fileTypes('jpeg|png')->message('Photo must be jpeg/png image')
	]
]);

$validation_a->validate();

翻译

翻译与自定义消息不同。翻译可能在您使用自定义消息进行 innot_inmimesuploaded_file 规则时需要。

例如,如果您使用规则 in:1,2,3,我们将设置无效消息为 "The Attribute only allows '1', '2', or '3'",其中部分 "'1', '2', or '3'" 来自 ":allowed_values" 标签。因此,如果您有自定义印度尼西亚语消息 ":attribute hanya memperbolehkan :allowed_values",我们将设置无效消息为 "Attribute hanya memperbolehkan '1', '2', or '3'",其中 "or" 一词不是印尼语的一部分。

因此,为了解决这个问题,我们可以使用翻译如下

// Set translation for words 'and' and 'or'.
$validator->setTranslations([
    'and' => 'dan',
    'or' => 'atau'
]);

// Set custom message for 'in' rule
$validator->setMessage('in', ":attribute hanya memperbolehkan :allowed_values");

// Validate
$validation = $validator->validate($inputs, [
    'nomor' => 'in:1,2,3'
]);

$message = $validation->errors()->first('nomor'); // "Nomor hanya memperbolehkan '1', '2', atau '3'" 

实际上,我们的内置规则只使用单词 'and' 和 'or',您可能需要将其翻译。

与错误消息一起工作

错误信息收集在 IgniteKit\Validation\ErrorBag 对象中,您可以通过 errors() 方法获取它。

$validation = $validator->validate($inputs, $rules);

$errors = $validation->errors(); // << ErrorBag

现在您可以使用以下方法来检索错误信息

all(string $format = ':message')

获取所有消息作为一个扁平数组。

示例

$messages = $errors->all(); 
// [
//     'Email is not valid email',
//     'Password minimum 6 character',
//     'Password must contains capital letters'
// ]

$messages = $errors->all('<li>:message</li>');
// [
//     '<li>Email is not valid email</li>',
//     '<li>Password minimum 6 character</li>',
//     '<li>Password must contains capital letters</li>'
// ]

firstOfAll(string $format = ':message', bool $dotNotation = false)

从所有现有键中只获取第一个消息。

示例

$messages = $errors->firstOfAll(); 
// [
//     'email' => Email is not valid email',
//     'password' => 'Password minimum 6 character',
// ]

$messages = $errors->firstOfAll('<li>:message</li>');
// [
//     'email' => '<li>Email is not valid email</li>',
//     'password' => '<li>Password minimum 6 character</li>',
// ]

参数 $dotNotation 用于数组验证。如果它为 false,则返回原始数组结构;如果为 true,则返回使用点表示法的扁平数组。

例如

$messages = $errors->firstOfAll(':message', false); 
// [
//     'contacts' => [
//          1 => [
//              'email' => 'Email is not valid email',
//              'phone' => 'Phone is not valid phone number'
//          ],
//     ],
// ]

$messages = $errors->firstOfAll(':message', true);
// [
//     'contacts.1.email' => 'Email is not valid email',
//     'contacts.1.phone' => 'Email is not valid phone number',
// ]

first(string $key)

从给定键获取第一个消息。如果键有错误消息,则返回 string;如果没有错误,则返回 null

例如

if ($emailError = $errors->first('email')) {
    echo $emailError;
}

toArray()

按键分组获取所有消息。

例如

$messages = $errors->toArray();
// [
//     'email' => [
//         'Email is not valid email'
//     ],
//     'password' => [
//         'Password minimum 6 character',
//         'Password must contains capital letters'
//     ]
// ]

count()

获取消息数量。

has(string $key)

检查给定的键是否有错误。如果键有错误,则返回 bool,否则返回其他值。

获取已验证、有效和无效数据

例如,您有以下验证:

$validation = $validator->validate([
    'title' => 'Lorem Ipsum',
    'body' => 'Lorem ipsum dolor sit amet ...',
    'published' => null,
    'something' => '-invalid-'
], [
    'title' => 'required',
    'body' => 'required',
    'published' => 'default:1|required|in:0,1',
    'something' => 'required|numeric'
]);

您可以使用以下示例中的方法获取验证数据、有效数据或无效数据

$validatedData = $validation->getValidatedData();
// [
//     'title' => 'Lorem Ipsum',
//     'body' => 'Lorem ipsum dolor sit amet ...',
//     'published' => '1' // notice this
//     'something' => '-invalid-'
// ]

$validData = $validation->getValidData();
// [
//     'title' => 'Lorem Ipsum',
//     'body' => 'Lorem ipsum dolor sit amet ...',
//     'published' => '1'
// ]

$invalidData = $validation->getInvalidData();
// [
//     'something' => '-invalid-'
// ]

可用规则

点击显示详细信息。

required

在此验证下的字段必须存在且不为'空'。

以下是一些示例

对于上传的文件,$_FILES['key']['error'] 不能为 UPLOAD_ERR_NO_FILE

required_if:another_field,value_1,value_2,...

在此规则下的字段必须存在且不为空,如果 anotherfield 字段等于任何值。

例如,required_if:something,1,yes,on 如果 something 的值是 1'1''yes''on' 之一,则将强制执行。

required_unless:another_field,value_1,value_2,...

在此验证下的字段必须存在且不为空,除非 anotherfield 字段等于任何值。

required_with:field_1,field_2,...

在此验证下的字段必须存在且不为空,仅当其他指定的字段之一存在时。

required_without:field_1,field_2,...

在此验证下的字段必须存在且不为空,仅当其他指定的字段之一不存在时。

required_with_all:field_1,field_2,...

在此验证下的字段必须存在且不为空,仅当所有其他指定的字段都存在时。

required_without_all:field_1,field_2,...

在此验证下的字段必须存在且不为空,仅当所有其他指定的字段都不存在时。

uploaded_file:min_size,max_size,extension_a,extension_b,...

此规则将验证来自 $_FILES 的数据。在此规则下的字段必须遵循以下规则才能有效:

  • $_FILES['key']['error'] 必须为 UPLOAD_ERR_OKUPLOAD_ERR_NO_FILE。对于 UPLOAD_ERR_NO_FILE,您可以使用 required 规则进行验证。
  • 如果提供了最小大小,上传的文件大小不能低于最小大小。
  • 如果提供了最大大小,上传的文件大小不能高于最大大小。
  • 如果提供了文件类型,则 MIME 类型必须是给定类型之一。

以下是一些示例定义和说明

  • uploaded_file:上传的文件是可选的。当它不为空时,它必须是 ERR_UPLOAD_OK
  • required|uploaded_file:上传的文件是必需的,且必须是 ERR_UPLOAD_OK
  • uploaded_file:0,1M:上传的文件大小必须在 0 - 1 MB 之间,但上传的文件是可选的。
  • required|uploaded_file:0,1M,png,jpeg:上传的文件大小必须在 0 - 1MB 之间,且 MIME 类型必须是 image/jpegimage/png

可选地,如果您希望在大小和类型验证之间有独立的错误消息,可以使用 mimes 规则来验证文件类型,使用 minmaxbetween 来验证其大小。

对于多个文件上传,PHP 会给出不理想的 $_FILES 结构([这里](https://php.ac.cn/manual/en/features.file-upload.multiple.php#53240) 是相关主题)。因此,我们创建了 uploaded_file 规则来自动解析您的 $_FILES 值为有序数组结构。这意味着,您不仅可以使用 minmaxbetweenmimes 规则来验证多个文件上传,还应该放置 uploaded_file 以解析其值并确保该值是正确的上传文件值。

例如,如果您有如下输入文件

<input type="file" name="photos[]"/>
<input type="file" name="photos[]"/>
<input type="file" name="photos[]"/>

您可以直接这样验证

$validation = $validator->validate($_FILES, [
    'photos.*' => 'uploaded_file:0,2M,jpeg,png'
]);

// or

$validation = $validator->validate($_FILES, [
    'photos.*' => 'uploaded_file|max:2M|mimes:jpeg,png'
]);

或者,如果您有如下输入文件

<input type="file" name="images[profile]"/>
<input type="file" name="images[cover]"/>

您可以这样验证

$validation = $validator->validate($_FILES, [
    'images.*' => 'uploaded_file|max:2M|mimes:jpeg,png',
]);

// or

$validation = $validator->validate($_FILES, [
    'images.profile' => 'uploaded_file|max:2M|mimes:jpeg,png',
    'images.cover' => 'uploaded_file|max:5M|mimes:jpeg,png',
]);

现在当您使用 getValidData()getInvalidData() 时,您将获得类似于单个文件上传的良好数组结构。

mimes:extension_a,extension_b,...

在验证下的 $_FILES 项必须具有与列表中列出的扩展名之一相对应的 MIME 类型。

default/defaults

这是一个特殊的规则,它不会进行任何验证。它只是如果该属性为空或不存在,则将默认值设置到您的属性中。

例如,如果您有如下验证

$validation = $validator->validate([
    'enabled' => null
], [
    'enabled' => 'default:1|required|in:0,1'
    'published' => 'default:0|required|in:0,1'
]);

$validation->passes(); // true

// Get the valid/default data
$valid_data = $validation->getValidData();
$enabled = $valid_data['enabled'];
$published = $valid_data['published'];

验证通过,因为我们为 enabledpublished 设置了默认值 10,这是有效的。

email

此验证下的字段必须是有效的电子邮件地址。

uppercase

此验证下的字段必须是有效的全大写。

lowercase

此验证下的字段必须是有效的全小写。

json

此验证下的字段必须是有效的 JSON 字符串。

alpha

此规则下的字段必须是完全由字母字符组成。

numeric

此规则下的字段必须是数字。

alpha_num

此规则下的字段必须是完全由字母数字字符组成。

alpha_dash

此规则下的字段可以包含字母数字字符,以及破折号和下划线。

alpha_spaces

此规则下的字段可以包含字母字符,以及空格。

in:value_1,value_2,...

此规则下的字段必须包含在给定的值列表中。

此规则使用 in_array 来检查值。默认情况下,in_array 禁用了严格检查。因此,它不会检查数据类型。如果您想启用严格检查,可以像在规则 in 中那样调用验证器并调用 strict()

$validation = $validator->validate($data, [
    'enabled' => [
        'required', 
        $validator('in', [true, 1])->strict()
    ]
]);

然后 'enabled' 的值应该是布尔值 true,或整数 1

not_in:value_1,value_2,...

此规则下的字段不得包含在给定的值列表中。

此规则也使用 in_array。您可以通过调用验证器并像规则 in 中的示例那样调用 strict() 来启用严格检查。

min:number

此规则下的字段必须大于或等于给定的数字。

对于字符串值,大小对应于字符数。对于整数或浮点值,大小对应于其数值。对于数组,大小对应于数组计数。如果您的值是数值字符串,您可以放置 numeric 规则来按数值值处理其大小,而不是字符数。

您还可以使用此规则验证上传的文件,以验证上传文件的最小大小。例如

$validation = $validator->validate([
    'photo' => $_FILES['photo']
], [
    'photo' => 'required|min:1M'
]);
max:number

此规则下的字段大小必须低于或等于给定数值。值大小计算方式与 min 规则相同。

您还可以使用此规则验证上传的文件,以验证上传文件的最大大小。例如

$validation = $validator->validate([
    'photo' => $_FILES['photo']
], [
    'photo' => 'required|max:2M'
]);
between:min,max

此规则下的字段大小必须在 min 和 max 参数之间。值大小计算方式与 minmax 规则相同。

您还可以使用此规则验证上传文件的大小。例如

$validation = $validator->validate([
    'photo' => $_FILES['photo']
], [
    'photo' => 'required|between:1M,2M'
]);
digits:value

验证的字段必须是数字,并且长度必须与 value 完全相同。

digits_between:min,max

验证的字段长度必须在给定的 minmax 之间。

url

此规则下的字段必须是有效的 URL 格式。默认情况下,它检查常见的 URL 方案格式如 any_scheme://...。但您可以指定 URL 方案。

例如

$validation = $validator->validate($inputs, [
    'random_url' => 'url',          // value can be `any_scheme://...`
    'https_url' => 'url:http',      // value must be started with `https://`
    'http_url' => 'url:http,https', // value must be started with `http://` or `https://`
    'ftp_url' => 'url:ftp',         // value must be started with `ftp://`
    'custom_url' => 'url:custom',   // value must be started with `custom://`
    'mailto_url' => 'url:mailto',   // value must conatin valid mailto URL scheme like `mailto:a@mail.com,b@mail.com`
    'jdbc_url' => 'url:jdbc',       // value must contain valid jdbc URL scheme like `jdbc:mysql:///dbname`
]);

对于常见的 URL 方案和 mailto,我们结合 FILTER_VALIDATE_URL 验证 URL 格式,并用 preg_match 验证其方案。除了 JDBC URL,目前它仅检查有效的 JDBC 方案。

integer此规则下的字段必须是整数。
boolean

此规则下的字段必须是布尔值。接受的输入有 truefalse"true""false"10"0""1""y""n"

ip

此规则下的字段必须是有效的 ipv4 或 ipv6。

ipv4

此规则下的字段必须是有效的 ipv4。

ipv6

此规则下的字段必须是有效的 ipv6。

extension:extension_a,extension_b,...

此规则下的字段必须以列出的其中一个扩展名结尾。

这对于验证给定路径或 URL 的文件类型很有用。对于上传验证,应使用 mimes 规则。

array

此规则下的字段必须是数组。

same:another_field

此规则下的字段值必须与 another_field 值相同。

regex:/your-regex/

此规则下的字段必须匹配给定的正则表达式。

date:format

此规则下的字段必须是有效的日期格式。参数 format 是可选的,默认格式是 Y-m-d

accepted

此规则下的字段必须是 'on''yes''1''true'true 之一。

present

此规则下的字段必须存在,无论其值如何。

different:another_field

same 的相反。此规则下的字段值必须与 another_field 值不同。

after:tomorrow

可以将 strtotime 可以解析的任何内容作为此规则的参数传递。有效的示例包括

  • after:next week
  • after:2016-12-31
  • after:2016
  • after:2016-12-31 09:56:02
before:yesterday

这与 after 规则 以相同的方式工作。传递任何可以由 strtotime 解析的内容。

callback

您可以使用此规则来定义自己的验证规则。此规则不能使用字符串管道注册。要使用此规则,您应该在规则数组中放置闭包。

例如

$validation = $validator->validate($_POST, [
    'even_number' => [
        'required',
        function ($value) {
            // false = invalid
            return (is_numeric($value) AND $value % 2 === 0);
        }
    ]
]);

您可以通过返回一个字符串来设置无效消息。例如,上面的示例将是

$validation = $validator->validate($_POST, [
    'even_number' => [
        'required',
        function ($value) {
            if (!is_numeric($value)) {
                return ":attribute must be numeric.";
            }
            if ($value % 2 !== 0) {
                return ":attribute is not even number.";
            }
            // you can return true or don't return anything if value is valid
        }
    ]
]);

注意: IgniteKit\Validation\Rules\Callback 实例已绑定到您的闭包中。因此,您可以使用 $this 访问规则属性和方法。

注册/覆盖规则

使用自定义验证规则的一种方法是创建一个继承自IgniteKit\Validation\Rule的类。然后使用setValidatoraddValidator来注册它。

例如,你想创建一个unique验证器,用来从数据库中检查字段的可用性。

首先,让我们创建UniqueRule

<?php

use IgniteKit\Validation\Rule;

class UniqueRule extends Rule
{
    protected $message = ":attribute :value has been used";
    
    protected $fillableParams = ['table', 'column', 'except'];
    
    protected $pdo;
    
    public function __construct(PDO $pdo)
    {
        $this->pdo = $pdo;
    }
    
    public function check($value): bool
    {
        // make sure required parameters exists
        $this->requireParameters(['table', 'column']);
    
        // getting parameters
        $column = $this->parameter('column');
        $table = $this->parameter('table');
        $except = $this->parameter('except');
	
        if ($except AND $except == $value) {
            return true;
        }
	
        // do query
        $stmt = $this->pdo->prepare("select count(*) as count from `{$table}` where `{$column}` = :value");
        $stmt->bindParam(':value', $value);
        $stmt->execute();
        $data = $stmt->fetch(PDO::FETCH_ASSOC);
	
        // true for valid, false for invalid
        return intval($data['count']) === 0;
    }
}

然后你需要将UniqueRule实例注册到验证器中,如下所示

use IgniteKit\Validation\Validator;

$validator = new Validator;

$validator->addValidator('unique', new UniqueRule($pdo));

现在你可以这样使用它

$validation = $validator->validate($_POST, [
    'email' => 'email|unique:users,email,exception@mail.com'
]);

在上面的UniqueRule中,属性$message用于默认的无效消息。属性$fillable_params用于fillParameters方法(在IgniteKit\Validation\Rule类中定义)。默认情况下,fillParameters将填充$fillable_params中列出的参数。例如,上面的示例中的unique:users,email,exception@mail.com将设置

$params['table'] = 'users';
$params['column'] = 'email';
$params['except'] = 'exception@mail.com';

如果你想让你的自定义规则接受类似innot_inuploaded_file规则的参数列表,你只需要在你的自定义规则类中重写fillParameters(array $params)方法。

注意,我们上面创建的unique规则也可以这样使用

$validation = $validator->validate($_POST, [
    'email' => [
    	'required', 'email',
    	$validator('unique', 'users', 'email')->message('Custom message')
    ]
]);

所以你可以通过添加一些返回其自身实例的方法来改进上面的UniqueRule

<?php

use IgniteKit\Validation\Rule;

class UniqueRule extends Rule
{
    ...
    
    public function table($table)
    {
        $this->params['table'] = $table;
        return $this;
    }
    
    public function column($column)
    {
        $this->params['column'] = $column;
        return $this;
    }
    
    public function except($value)
    {
        $this->params['except'] = $value;
        return $this;
    }
    
    ...
}

然后你可以用这种方式使用它

$validation = $validator->validate($_POST, [
    'email' => [
    	'required', 'email',
    	$validator('unique')->table('users')->column('email')->except('exception@mail.com')->message('Custom message')
    ]
]);

隐式规则

隐式规则是一个规则,如果它无效,则忽略后续规则。例如,如果属性没有通过required*规则,那么大多数情况下,后续规则也将无效。因此,为了防止我们的后续规则消息被收集,我们将required*规则设置为隐式。

要使你的自定义规则成为隐式,你可以将$implicit属性值设置为true。例如

<?php

use IgniteKit\Validation\Rule;

class YourCustomRule extends Rule
{

    protected $implicit = true;

}

修改值

在某些情况下,你可能希望你的自定义规则能够修改其属性值,就像我们的default/defaults规则一样。因此,在当前和后续规则检查中,将使用你的修改后的值。

为此,你应该实现IgniteKit\Validation\Rules\Interfaces\ModifyValue并在你的自定义规则类中创建一个名为modifyValue($value)的方法。

例如

<?php

use IgniteKit\Validation\Rule;
use IgniteKit\Validation\Rules\Interfaces\ModifyValue;

class YourCustomRule extends Rule implements ModifyValue
{
    ...

    public function modifyValue($value)
    {
        // Do something with $value

        return $value;
    }

    ...
}

在验证之前

你可能想在验证运行之前做一些准备工作。例如,我们的uploaded_file规则会将来自$_FILES(不希望的)数组的结构解析为良好的组织结构,这样我们就可以像验证其他数据一样验证多个文件上传。

为此,你应该实现IgniteKit\Validation\Rules\Interfaces\BeforeValidate并在你的自定义规则类中创建一个名为beforeValidate()的方法。

例如

<?php

use IgniteKit\Validation\Rule;
use IgniteKit\Validation\Rules\Interfaces\BeforeValidate;

class YourCustomRule extends Rule implements BeforeValidate
{
    ...

    public function beforeValidate()
    {
        $attribute = $this->getAttribute(); // IgniteKit\Validation\Attribute instance
        $validation = $this->validation; // IgniteKit\Validation\Validation instance

        // Do something with $attribute and $validation
        // For example change attribute value
        $validation->setValue($attribute->getKey(), "your custom value");
    }

    ...
}