asko / hird
为您的数据提供一个具有合理默认值的可扩展验证库。
Requires
- php: ^8.1
Requires (Dev)
- pestphp/pest: ^1.21
README
Hird,也称为housecarls,是hirdmen的聚集地,他们在维京时代和早期中世纪时期担任国王的个人卫兵。
Hird是一个具有合理默认值的可扩展验证库。
安装
您可以通过composer安装此包
composer require asko/hird
用法
Hird接受一个字段数组$fields
和一个规则数组$rules
。
$fields
数组中每个项目的键必须与$rules
数组中每个项目的键对应,这样Hird就能知道如何将它们关联起来。
$rules
必须是一个字符串值,其中规则通过|
字符分隔,每个规则必须匹配已实现的验证器的键,例如len
、email
或您自己实现的规则。此外,每个规则还可以接受一个修改器,其中规则名和修改器通过:
字符分隔。
例如,假设我们有一个名为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)
来注册它。