hylianshield / validator
数据验证
Requires
- php: ^7.0
Requires (Dev)
- phpunit/phpunit: ~5.5.3
Suggests
- hylianshield/validator-pcre: Use PCRE regular expressions as validator.
README
HylianShield validator 是一个验证包,旨在创建一个通用的验证器接口。
其当前版本是专门为 PHP7 构建的。与前辈相比,HylianShield validator 包的当前版本已经精简到验证的必要需求。
安装
composer require hylianshield/validator:^2.1.0
配置
对于此包,无需考虑配置。
验证器
验证器至少包含以下两个方法
getIdentifier
public function getIdentifier(): string
此方法用于为验证器创建一个唯一的标识符。在调试验证器行为或识别已屏蔽某些验证主题的验证器时很有用。
validate
public function validate($subject): bool
validate 方法接受一个验证主题,并返回主题是否有效。
验证器集合
除了为验证器实现接口外,还公开了一个验证器集合接口。
此集合本身实现了一个扩展验证器接口的接口。因此,验证器集合本身也是一个验证器。
除了验证器的共享功能外,它还有一个添加验证器的方法,以及一个删除验证器的方法。
如果在集合上调用 validate
方法,它将验证集合内的验证器。
根据使用的集合类型不同,验证结果也会不同
因为集合本身是一个验证器,它可以接受另一个集合作为已注册的验证器。
注意:为了避免对性能产生负面影响,没有对递归注册集合进行测试。因此,当集合构建不当时,可能会导致函数嵌套溢出。
此外,集合会嵌套标识符的格式。假设一个 MatchAnyCollection
包含具有标识符 Foo 和 Bar 的验证器,则集合的标识符将是
any(<Foo>, <Bar>)
如果再嵌套一层,结合 MatchAllCollection
,可以得到以下结果
any(<Foo>, all(<Bar>, <Baz>))
此特定验证器将在 Foo 验证器通过、Bar 和 Baz 验证器都通过或所有三个验证器都通过时通过。
NotValidator
当想要反转任何给定验证器或集合的验证时,可以将其包裹在 NotValidator
中。
/** ValidatorInterface $validator */ $notValidator = new NotValidator($validator); $validator->validate('something'); // true $notValidator->validate('something'); // false $validator->validate('somethingElse'); // false $notValidator->validate('somethingElse'); // true echo $validator->getIdentifier(); // something echo $notValidator->getIdentifier(); // not(<something>)
匿名验证器
从 PHP 7 开始,PHP 支持匿名类。可以轻松创建一个自定义验证器,而无需为验证器引入完全限定的类名。
use HylianShield\Validator\ValidatorInterface; use Acme\User\UserManagerInterface; $userValidator = new class($userManager) implements ValidatorInterface { /** * @var UserManagerInterface */ protected $userManager; /** * Initialize a new user validator. * * @param UserManagerInterface $userManager */* public function __construct(UserManagerInterface $userManager) { $this->userManager = $userManager; } /** * Get the identifier for the validator. * * @return string */ public function getIdentifier(): string { return 'user'; } /** * Validate the given subject. * * @param mixed $subject * @return bool */ public function validate($subject): bool { return $this->userManager->contains($subject); } };
通过这种方式,您可以创建一个验证器,以断言给定用户是否存在。
您甚至可以将其与现有验证器结合使用。
use HylianShield\Validator\Collection\MatchAllCollection; use Acme\User\Role\RoleValidator; use Acme\User\Role\AdminRole; $adminValidator = new MatchAllCollection(); $adminValidator->addValidator($userValidator); $adminValidator->addValidator( new RoleValidator(AdminRole::IDENTIFIER) ); $adminValidator->validate($nonexistentUser); // false $adminValidator->validate($normalUser); // false $adminValidator->validate($adminUser); // true echo $adminValidator->getIdentifier(); // all(<user>, <role:admin>)
调用者
在之前版本的此包中,可以将验证器传递给 array_filter
和 array_map
等函数。
为了在代码中正确分离关注点,并保持验证器接口对实现清洁,现在通过一个单独的 Invoker
对象来解决这个问题。
只需像这样包装验证器
use HylianShield\Validator\Invoker; $filtered = array_filter($input, new Invoker($validator));
这也适用于验证器集合。
请参阅 examples/
下的 invoker 代码示例,了解 invoker 的实现。