asko/hird

为您的数据提供一个具有合理默认值的可扩展验证库。

v2.1 2023-09-26 19:29 UTC

This package is auto-updated.

Last update: 2024-09-26 21:44:12 UTC


README

Latest Stable Version

Hird,也称为housecarls,是hirdmen的聚集地,他们在维京时代和早期中世纪时期担任国王的个人卫兵。

Hird

Hird是一个具有合理默认值的可扩展验证库。

安装

您可以通过composer安装此包

composer require asko/hird

用法

Hird接受一个字段数组$fields和一个规则数组$rules

$fields数组中每个项目的键必须与$rules数组中每个项目的键对应,这样Hird就能知道如何将它们关联起来。

$rules必须是一个字符串值,其中规则通过|字符分隔,每个规则必须匹配已实现的验证器的键,例如lenemail或您自己实现的规则。此外,每个规则还可以接受一个修改器,其中规则名和修改器通过:字符分隔。

例如,假设我们有一个名为len的验证器,它接受一个修改器,允许验证器验证字符串的长度。在这种情况下,我们将该规则写为len:8,这表示使用len验证器并将一个值为8的修改器传递给它。

示例用法

Hird的一个示例用法如下

use Askonomm\Hird\Hird;

$fields = ['email' => 'asko@asko.dev'];
$rules = ['email' => 'required|email|len:5'];
$hird = new Hird($fields, $rules);

if ($hird->fails()) {
    return $hird->errors();
}

从上面的示例中,您可以看到使用了两个Hird方法,如$hird->fails()$hird->errors()$hird->fails()方法将执行验证,并返回一个布尔值,表示验证是否失败,如果失败则为true$hird->errors()方法将返回一个数组,其中包含所有错误,如验证器定义。

您还可以使用$hird->firstError()方法获取第一个错误而不是所有错误。

如果您希望在不需要调用$hird->fails()的情况下运行验证,则可以调用$hird->validate()

在验证消息中覆盖字段名称

您可以使用$hird->setFieldNames来覆盖用于错误消息的字段名称,以便将email显示为E-mail。只需提供一个数组,其中键是您使用Hird实例化的实际字段名称,值是您希望在验证消息中使用的名称,如下所示

$hird->setFieldNames(['email' => 'E-mail']);

手动添加错误

在某些情况下,您想使用与Hird提供的错误消息相同的验证器错误消息,但想将其与Hird之外进行的验证混合。为此,您可以使用addError方法,如下所示

$hird->addError("My error message goes here");

这将提示Hird验证失败并显示该错误消息。

内置验证器

默认情况下,有一些内置验证器可供使用。如果您想删除内置验证器,可以使用$hird->removeValidator('rule-name')方法删除一个。

email

email验证器验证电子邮件地址,并注册为email规则。

use Askonomm\Hird\Hird;

$fields = ['email' => 'asko@bien.ee'];
$rules = ['email' => 'email'];
$hird = new Hird($fields, $rules);

len

len验证器验证字符串的长度,并注册为len规则。len验证器还接受并需要修改器。可以通过在规则后附加颜色字符:并将修改器传递给它来传递修改器,例如len:8

use Askonomm\Hird\Hird;

$fields = ['password' => 'SuperSecretPassword'];
$rules = ['password' => 'len:10'];
$hird = new Hird($fields, $rules);

required

《required》验证器用于验证值是否存在,并注册为《required》规则。如果值已设置且不是空字符串,则验证通过。

use Askonomm\Hird\Hird;

$fields = ['password' => 'SuperSecretPassword'];
$rules = ['password' => 'required'];
$hird = new Hird($fields, $rules);

date-format

《date-format》验证器用于验证日期的字符串格式,并注册为《date-format》规则。如果值已设置且符合规则指定的格式,则验证通过。

use Askonomm\Hird\Hird;

$fields = ['date' => '2020-09-17'];
$rules = ['date' => 'date-format:Y-m-d'];
$hird = new Hird($fields, $rules);

创建验证器

您还可以创建自己的验证器,或者如果您对现有验证器不满意,可以替换它们。

注意:要替换现有验证器,首先通过 $hird->removeValidator('rule-name') 删除内置验证器,然后通过 $hird->registerValidator('rule-name', ValidatorClass::class) 添加您自己的验证器。

验证器是一个实现了《Validator》接口的类。一个正确的验证器示例可能看起来像这样

use Asko\Hird\Validators\Validator;

class EmailValidator implements Validator
{
    public function __construct(
        private array $fields, // all fields data
        private array $fieldNames, // names of fields
    ){
    }

    /**
     * Returns a boolean `true` when given `$value` is a valid e-mail
     * address. Returns `false` otherwise.
     *
     * @param mixed $value
     * @param mixed $modifier
     * @return boolean
     */
    public function validate(string $field, mixed $value, mixed $modifier = null): bool
    {
        return filter_var($value, FILTER_VALIDATE_EMAIL);
    }

    /**
     * Composes the error message in case the validation fails.
     *
     * @param string $field
     * @param mixed $modifier
     * @return string
     */
    public function composeError(string $field, mixed $modifier = null): string
    {
        return "${field} is not a valid e-mail address.";
    }
}

您可以看到有两个方法,一个用于验证 $value,另一个用于在验证失败时生成错误信息。这两个函数都接受一个 $modifier 参数,该参数仅在验证器使用修饰符时才有值。例如,len 验证器使用修饰符来确定所需的字符串长度,通过将规则传递为 len:{number-of-characters} 来实现。

创建您的验证器类后,可以通过调用 $hird->registerValidator('rule-name', YourValidator::class) 来注册它。