weew/validator

简单的验证库。

v3.8.0 2016-08-26 14:05 UTC

README

Build Status Code Quality Test Coverage Version Licence

目录

安装

composer require weew/validator

可用约束

额外的约束包

还有其他约束可以通过composer加载。

约束

约束是验证逻辑的小片段。约束可以在没有验证器的情况下单独使用。

$constraint = new EmailConstraint();
// or
$constraint = new EmailConstraint('Custom error message.');
$check = $constraint->check('foo@bar.baz');

if ($check) {
    // valdiation passed
} else {
    echo $constraint->getMessage();
}

约束组

约束组允许您为单个值配置多个约束。

$group = new ConstraintGroup('email', [
    new EmailConstraint(),
]);
// or
$group = new ConstraintGroup('email');
$group->addConstraint(new EmailConstraint());

约束组可以在没有验证器的情况下验证数据。`check` 方法返回一个 `ValidationResult` 对象。

$result = $group->check('foo@bar.baz');

验证器

使用验证器的最简单方法是通过创建一个新的实例并在行内添加约束。验证器将返回一个 `ValidationResult` 对象。

$validator = new Validator();
$data = ['username' => 'foo', 'email' => 'foo@bar.baz'];

$result = $validator->check($data, [
    new ConstraintGroup('email', [
        new EmailConstraint(),
    ]),
]);

验证结果和验证错误

验证结果用于分组发生的验证错误。验证错误包含有关验证属性、它们的值和应用的约束的信息。

if ($result->isFailed()) {
    foreach ($result->getErrors() as $error) {
        // $error->getSubject()
        // $error->getValue()
        // $error->getMessage()
        // $error->getConstraint()
    }
}

编写自定义验证器

您可以使用预定义的约束来组合验证器,这些约束将在每次验证时应用。

$data = ['username' => 'foo', 'email' => 'foo@bar.baz'];
$validator->addConstraint('email', new EmailConstraint());
$validator->addConstraints('username', [
    new AlphaConstraint(),
    new MinMaxLengthConstraint(3, 20),
]);

$result = $validator->check($data);

创建自定义验证器类

行内配置验证器并不总是最好的解决方案。有时您可能想要创建专门的验证器类。使用此库,这非常容易实现。

class UserProfileValidator extends Validator {
    protected function configure() {
        $this->addConstraint('email', new EmailConstraint());
        $this->addConstraints('username', [
            new AlphaConstraint(),
            new MinMaxLengthConstraint(3, 20),
        ]);
    }
}

$data = ['username' => 'foo', 'email' => 'foo@bar.baz'];
$validator = new UserProfileValidator();
$result = $validator->check($data);

自定义约束

创建一个新的约束相对简单。您只需实现 `IConstraint` 接口即可。这是一个如何创建一个简单约束的示例,以确保一个数字在给定的范围内。

class MinMaxConstraint implements IConstraint {
    protected $min;
    protected $max;
    protected $message;

    public function __construct($min, $max, $message = null) {
        $this->min = $min;
        $this->max = $max;
        $this->message = $message;
    }

    public function check($value, IValidationData $data = null) {
        if (is_numeric($value)) {
            return $value >= $this->min && $value <= $this->max;
        }

        return false;
    }

    public function getMessage() {
        if ($this->message !== null) {
            return $this->message;
        }

        return 'Some default error message.';
    }

    public function getOptions() {
        return [
            'min' => $this->min,
            'max' => $this->max,
        ];
    }
}

通配符验证

想象您有一个类似的结构需要验证。

$input = [
    'items' => [
        ['name' => 'name1'],
        ['name' => null],
        ['name' => 'name3'],
    ],
];

为了验证 `items` 数组中每个元素的 `name` 属性,您需要手动遍历项目。您还可以使用通配符来针对所有值。要通配符数组值,您可以使用此特殊字符 `*`。

$result = $validator->addConstraint('items.*.name', new NotNullConstraint());

在上面的示例中,结果将包含一个主题为 `items.1.name` 的错误。

数组键也可以使用通配符进行验证。您必须使用不同的通配符字符 `#`。请注意,通配符字符 `#` 应始终是路径段的最后一个。这是错误的 `foo.#.bar`,这是正确的 `foo.bar.#`。

$input = [
    'items' => [
        'name1' => 'value1',
        '2' => 'value2',
        'name3' => 'value3',
    ],
];

$result = $validator->addConstraint('items.#', new MinMaxLengthConstraint(3, 5));

结果将包含一个主题为 `#items.1` 的错误。如您所见,主题前有一个 `#` 前缀。这样,您就可以区分值和键的主题。

属性访问器

验证器支持多种数据类型。

数组访问器

此访问器添加了对基于数组的数据集的支持。

$data = ['email' => 'foo@bar.baz'];
$validator->check($data);

对象访问器

此访问器添加了对基于对象的数据集的支持。

$data = new stdClass();
$data->email = 'foo@bar.baz';
$validator->check($data);

获取器访问器

此访问器添加了对只能通过getter方法访问数据的对象的支持。

class User {
    protected $username;
    public function __construct($username) {
        $this->username = $username;
    }
    public function getUsername() {
        return $this->username;
    }
}

$validator->check(new User('foo'));