alleyinteractive / laminas-validator-extensions
为 laminas-validator 框架提供额外的验证类。
Requires
- php: ^8.0
- laminas/laminas-validator: ^2.20
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.8
- phpunit/phpunit: ^9.5
- squizlabs/php_codesniffer: ^3.6
README
此包为 Laminas Validator 框架提供额外的验证类,以及一个自定义的基本验证类。
安装
使用以下命令安装最新版本:
$ composer require alleyinteractive/laminas-validator-extensions
基本用法
有关验证器的作用、使用方法和如何编写自己的验证器的更多信息,请访问Laminas 文档。
基本验证器
ExtendedAbstractValidator
抽象类 Alley\Validator\ExtendedAbstractValidator
使用 \Laminas\Validator\AbstractValidator
标准化自定义验证器的实现。
在扩展 ExtendedAbstractValidator
时,验证逻辑应放入一个新的 testValue()
方法中,该方法仅负责应用逻辑并添加任何验证错误。在评估输入之前不再需要调用 setValue()
,如果评估输入后没有错误消息,则 isValid()
返回 true
;如果有任何消息,则返回 false
。
之前
<?php class Float extends \Laminas\Validator\AbstractValidator { const FLOAT = 'float'; protected $messageTemplates = [ self::FLOAT => "'%value%' is not a floating point value", ]; public function isValid($value) { $this->setValue($value); if (! is_float($value)) { $this->error(self::FLOAT); return false; } return true; } }
之后
<?php class Float extends \Alley\Validator\ExtendedAbstractValidator { const FLOAT = 'float'; protected $messageTemplates = [ self::FLOAT => "'%value%' is not a floating point value", ]; public function testValue($value): void { if (! is_float($value)) { $this->error(self::FLOAT); } } }
FreeformValidator
独立、抽象的 Alley\Validator\FreeformValidator
类将大多数实现细节留给您自行决定,但对于项目特定或尚未准备更广泛分发的验证器来说,通常更容易使用。
与 ExtendedAbstractValidator
类类似,FreeformValidator
预期验证逻辑放入 testValue()
方法中,并且根据是否有错误消息,isValid()
将返回 true
或 false
。
可以使用接受消息键和文本的 error()
方法添加验证错误。
<?php class Float extends \Alley\Validator\FreeformValidator { public function testValue($value): void { if (! is_float($value)) { $this->error('float', 'Please enter a floating point value'); } } }
"任意验证器"链
\Alley\Validator\AnyValidator
类类似于Laminas 验证器链,不同之处在于它使用 "OR" 连接验证器,只要输入通过给定的任一验证器,就会标记为有效。
与 Laminas 验证器链不同,验证器只能附加,不能前置,且没有 $priority
参数。
基本用法
<?php $valid = new \Alley\Validator\AnyValidator([new \Laminas\Validator\LessThan(['max' => 10])]); $valid->attach(new \Laminas\Validator\GreaterThan(['min' => 90])); $valid->isValid(9); // true $valid->isValid(99); // true $valid->isValid(42); // false
"快速失败"验证器链
\Alley\Validator\FastFailValidatorChain
类类似于Laminas 验证器链,不同之处在于如果验证器失败,链会自动断开;没有 $breakChainOnFailure
参数。
与 Laminas 验证器链不同,验证器只能附加,不能前置,且没有 $priority
参数。
基本用法
$valid = new \Alley\Validator\FastFailValidatorChain([new \Laminas\Validator\LessThan(['max' => 10])]); $valid->attach(new \Laminas\Validator\GreaterThan(['min' => 90])); $valid->isValid(42); // false count($valid->getMessages()); // 1
按操作符名称访问验证器
\Alley\Validator\ValidatorByOperator
允许您使用可读的操作符名称(如 REGEX
或 NOT IN
)访问验证器。
其主要用途是允许您编写接受可读操作符名称作为参数的函数,同时使用验证器。以下是从wp-match-blocks 库中的示例函数调用。
<?php $images = \Alley\WP\match_blocks( $post, [ 'name' => 'core/image', 'attrs' => [ [ 'key' => 'credit', 'value' => '/(The )?Associated Press/i', 'operator' => 'REGEX', ], ], ], );
支持的操作符名称包括:
CONTAINS
和NOT CONTAINS
,它们使用区分大小写的搜索转发到\Alley\Validator\ContainsString
。IN
和NOT IN
,它们转发到\Alley\Validator\OneOf
。LIKE
和NOT LIKE
,使用不区分大小写的搜索,转发到\Alley\Validator\ContainsString
。REGEX
和NOT REGEX
,转发到\Laminas\Validator\Regex
。===
、!==
以及\Alley\Validator\Comparison
支持的其他运算符。
任何未转发到其他验证器的运算符名称都必须是有效的 Comparison
运算符。
基本用法
$valid = new \Alley\Validator\ValidatorByOperator('REGEX', '/^foo/'); $valid->isValid('foobar'); // true $valid = new \Alley\Validator\ValidatorByOperator('NOT IN', ['bar', 'baz']); $valid->isValid('bar'); // false $valid = new \Alley\Validator\ValidatorByOperator('!==', 42); $valid->isValid(43); // true
验证器
AlwaysValid
\Alley\Validator\AlwaysValid
将所有输入标记为有效。当需要禁用完整验证或验证不切实际时,它可以用来满足类型要求。
支持选项
无。
基本用法
<?php $valid = new \Alley\Validator\AlwaysValid(); $valid->isValid(42); // true $valid->isValid(false); // true $valid->isValid('abcdefghijklmnopqrstuvwxyz'); // true
Comparison
\Alley\Validator\Comparison
使用 PHP 比较运算符 将输入与另一个值进行比较。如果比较为真,则输入通过验证。输入放置在运算符的左侧。
支持选项
以下为 \Alley\Validator\Comparison
支持的选项
compared
:输入比较的值。它放置在运算符的右侧。operator
:用于比较输入和compared
的 PHP 比较运算符。
基本用法
<?php $valid = new \Alley\Validator\Comparison( [ 'operator' => '<=', 'compared' => 100, ] ); $valid->isValid(101); // false $valid = new \Alley\Validator\Comparison( [ 'operator' => '!==', 'compared' => false, ] ); $valid->isValid(true); // true
ContainsString
\Alley\Validator\ContainsString
是围绕 str_contains()
函数的验证器。每个验证器实例代表“针”字符串,并验证该字符串是否在输入“草堆”中找到。输入将自动转换为字符串。
支持选项
以下为 \Alley\Validator\ContainsString
支持的选项
needle
:要搜索的字符串或\Stringable
实例。它将在验证时自动转换为字符串。ignoreCase
:是否执行不区分大小写的搜索。默认为 False。
基本用法
<?php $valid = new \Alley\Validator\ContainsString( [ 'needle' => 'foo', ], ); $valid->isValid('foobar'); // true $valid->isValid('barbaz'); // false
DivisibleBy
\Alley\Validator\DivisibleBy
允许您验证输入是否可以整除给定的数值。输入将自动转换为整数。
支持选项
以下为 \Alley\Validator\DivisibleBy
支持的选项
divisor
:输入除以的值。它将自动转换为整数。
基本用法
<?php $valid = new \Alley\Validator\DivisibleBy( [ 'divisor' => 3, ], ); $valid->isValid(9); // true $valid->isValid(10); // false
Not
Alley\Validator\Not
反转给定验证器的有效性。它允许创建测试输入是否为“不是之一”等验证器,而不仅仅是“之一”。
支持选项
无。
基本用法
<?php $origin = new \Alley\Validator\OneOf(['haystack' => ['foo', 'bar']]); $valid = new \Alley\Validator\Not($origin, 'The input was invalid.'); $valid->isValid('foo'); // false $valid->isValid('baz'); // true
OneOf
Alley\Validator\OneOf
验证一个包含标量值的数组是否包含输入。
OneOf
是 \Laminas\Validator\InArray
的简化版本,它只接受“草堆”中的标量值并执行严格比较。作为回报,它产生一个更友好的错误消息,列出允许的值。
支持选项
以下为 \Alley\Validator\OneOf
支持的选项
haystack
:要搜索输入的数组。
基本用法
<?php $valid = new \Alley\Validator\OneOf(['haystack' => ['one', 'two', 'three']]); $valid->isValid('four'); // false $valid->getMessages(); // ['notOneOf' => 'Must be one of [one, two, three] but is four.']
类型
\Alley\Validator\Type
允许您验证输入是否为给定的 PHP 类型。如果输入是期望的类型,则通过验证。
此验证器灵感来源于 PHPUnit 的 \PHPUnit\Framework\Constraint\IsType
类。
支持选项
以下为 \Alley\Validator\Type
支持的选项
type
:期望的 PHP 类型。支持类型包括array
、bool
、boolean
、callable
、double
、float
、int
、integer
、iterable
、null
、numeric
、object
、real
、resource
、string
和scalar
。
基本用法
<?php $valid = new \Alley\Validator\Type(['type' => 'callable']); $valid->isValid('date_create_immutable'); // true $valid = new \Alley\Validator\Type(['type' => 'bool']); $valid->isValid([]); // false
WithMessage
Alley\Validator\WithMessage
允许您用自定义的失败代码和消息装饰验证器,替换验证器的常规失败消息。
支持选项
无。
基本用法
<?php $origin = new \Laminas\Validator\GreaterThan(42); $valid = new \Alley\Validator\WithMessage('tooSmall', 'Please enter a number greater than 42.', $origin); $valid->isValid(41); // false $valid->getMessages(); // ['tooSmall' => 'Please enter a number greater than 42.']