hylianshield/validator

2.1.0 2016-08-05 05:12 UTC

This package is auto-updated.

Last update: 2024-08-29 04:12:43 UTC


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 包含具有标识符 FooBar 的验证器,则集合的标识符将是

any(<Foo>, <Bar>)

如果再嵌套一层,结合 MatchAllCollection,可以得到以下结果

any(<Foo>, all(<Bar>, <Baz>))

此特定验证器将在 Foo 验证器通过、BarBaz 验证器都通过或所有三个验证器都通过时通过。

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_filterarray_map 等函数。

为了在代码中正确分离关注点,并保持验证器接口对实现清洁,现在通过一个单独的 Invoker 对象来解决这个问题。

只需像这样包装验证器

use HylianShield\Validator\Invoker;

$filtered = array_filter($input, new Invoker($validator));

这也适用于验证器集合。

请参阅 examples/ 下的 invoker 代码示例,了解 invoker 的实现。