gobline / filter
Gobline 过滤器组件
Requires
- php: >=5.6.0
Requires (Dev)
- fabpot/php-cs-fixer: *@dev
- gobline/translator: ~2.0
- phpunit/phpunit: 4.3.*@dev
- ramsey/uuid: ^3.0
Suggests
- gobline/translator: Allows to translate the error messages
- ramsey/uuid: Allows to validate UUIDs
README
过滤器组件用于清洗和/或验证变量。其强大之处在于能够定义“过滤器通道”,允许通过多个(内置或自定义)清洗器和验证器轻松地一次性过滤变量。
有两种类型的过滤器
- 清洗器 清洗数据。它们可能会更改数据,例如删除不需要的字符。
- 验证器 验证数据。如果数据有效,则返回 true,否则返回 false。
清洗器
示例
(new Gobline\Filter\Sanitizer\LTrim('/'))->sanitize('/some/path/'); // returns "some/path/" (new Gobline\Filter\Sanitizer\Cast('int'))->sanitize('42'); // returns integer 42
内置清洗器
- 类型转换
- 小写
- 左剪裁
- 右剪裁
- 删除标签
- 修剪
- 大写
验证器
示例
(new Gobline\Filter\Validator\Email())->isValid('mdecaffmeyer@gmail.com') // returns true (new Gobline\Filter\Validator\Length(5))->isValid('foo') // returns false
(new Gobline\Filter\Validator\Int())->isValid('foo') // returns false, "foo" is not an integer (new Gobline\Filter\Validator\Int())->isValid(42) // returns true
内置验证器
- 字母
- 字母数字
- 在...之间
- 布尔值 ('', '0', '1', 0 和 1 被视为有效的布尔值)
- 电子邮件
- 浮点数 (数值字符串被视为有效的整数)
- 整数 (数值字符串被视为有效的整数)
- 长度
- 最大值
- 最小值
- 无标签
- 必需的
- 正则表达式
- 值
- 标量
注意
可以在两组验证器之间进行区分
- 数据验证器 检查数据是否满足某些条件。
- 数据类型验证器 检查变量是否为特定数据类型。
这是因为知道 数据验证器 可能期望要过滤的变量为特定类型,并且如果类型不符合预期(例如,长度 验证器期望字符串),则会抛出异常,而 数据类型验证器 从不会抛出异常。
数据类型验证器 包括:Alpha,Alphanum,Boolean,Email,Float,Int,Scalar
数据验证器 包括:Between,Length,Max,Min,NoTags,Required,Regex,Value
错误信息
在数据验证失败的情况下,可以检索验证器的错误信息。
$validator = new Gobline\Filter\Validator\Int(); if (!$validator->isValid("foo")) { echo $validator->getMessage(); // prints "The input is not a valid number" }
支持自定义错误信息
$validator = new Gobline\Filter\Validator\Int(); $validator->setMessageTemplate('%value% is not a valid number'); if (!$validator->isValid("foo")) { echo $validator->getMessage(); // prints "foo is not a valid number" }
注意,您可以使用占位符如 %value% 以上。每个验证器都有自己的占位符(所有内置验证器都至少有 %value%)。例如,检查数字是否在两个数字之间的 Between 验证器提供了 3 个占位符: %value%,%min% 和 %max%。其默认消息为: 输入值不在 "%min%" 和 "%max%" 之间(包含)。
翻译器
您可以为全局错误消息添加翻译器
Gobline\Filter\Validator\AbstractValidator::setDefaultTranslator($translator);
或为实例
$validator->setTranslator($translator);
过滤器通道
组件的实际价值在于其创建过滤器通道的能力。过滤器通道允许您通过多个清洗器和/或验证器一次性过滤变量。
以下是一个示例,该示例修剪变量并检查它是否包含有效的年龄(介于 0 和 110 之间)。最终它将变量转换为整数。
$funnel = (new Gobline\Filter\FilterFunnel()) ->addSanitizer(new Sanitizer\Trim()) ->addValidator(new Validator\Int()) ->addValidator(new Validator\Between(0, 110)) ->addSanitizer(new Sanitizer\Cast('int')); $funnel->filter(30); // returns 30 $funnel->filter("foo"); // returns null echo $validator->getMessage(); // prints "The input is not a valid number"
如果验证器使数据无效,通道将返回 null
(并且不会执行后续的清洗器和验证器)。
可以在类映射中注册过滤器,以便在使用通道时通过类名引用过滤器。内置过滤器默认在类映射中注册。上面的示例可以重写如下
$age = (new Gobline\Filter\FilterFunnel()) ->addSanitizer('trim') ->addValidator('int') ->addValidator('between', 1, 110) ->addSanitizer('cast', 'int') ->filter($age);
上面的示例也可以写成以下形式
$age = (new Gobline\Filter\FilterFunnel()) ->add('trim') ->add('int') ->add('between', 1, 110) ->add('cast', 'int') ->filter($age);
或
$age = (new Gobline\Filter\FilterFunnel()) ->trim ->int ->between(1, 110) ->cast('int') ->filter($age);
或
$age = (new Gobline\Filter\FilterFunnel()) ->filter($age, 'trim|int|between(1,110)|cast(int)');
可选值
$age = (new Gobline\Filter\FilterFunnel()) ->setOptional() ->addSanitizer('trim') ->addValidator('int') ->addValidator('between', 1, 110) ->addSanitizer('cast', 'int') ->filter($age);
或
$age = (new Gobline\Filter\FilterFunnel()) ->filter($age, 'optional|trim|int|between(1,110)|cast(int)');
如果 $age
是空字符串或 null,过滤器漏斗将返回 null 而不显示任何错误信息,因为该字段是可选的。
添加自定义过滤器
要将您自己的自定义过滤器添加到类映射中,请使用 FilterFunnelFactory
工厂类。
$map = new FilterClassMap(); $map->addValidator('foo', 'My\\Filter\\Validator\\FooValidator'); $factory = new FilterFunnelFactory($map); $funnel = $factory->createFunnel();
在使用漏斗时,您仍然可以为验证器设置自定义消息。
$age = (new Gobline\Filter\FilterFunnel()) ->addSanitizer('trim') ->addValidator('int') ->setMessageTemplate('"%value%" is not a valid number') ->addValidator('between', 1, 110) ->setMessageTemplate('%value% must be a number between %min% and %max%') ->addSanitizer('cast', 'int') ->filter($age);
请注意,setMessageTemplate()
应该直接跟随一个 addValidator()
调用,否则将抛出异常。
对象过滤器
您可以通过实现 FilterableInterface
接口来过滤对象的属性。
$objectFilter = new ObjectFilter(); $person = $objectFilter->filter(new Person($inputName, $inputAge, $inputGender)); if ($objectFilter->hasMessages()) { // ... } class Person implements FilterableInterface { private $name; private $age; private $gender; private $deceased; private $email; public function __construct($name, $age, $gender, $deceased = false) { $this->name = $name; $this->age = $age; $this->gender = $gender; $this->deceased = $deceased; } public function getName() { return $this->name; } public function setName($name) { $this->name = $name; } public function getAge() { return $this->age; } public function setAge($age) { $this->age = $age; } public function getGender() { return $this->gender; } public function setGender($gender) { $this->gender = $gender; } public function isDeceased() { return $this->deceased; } public function setDeceased($deceased) { $this->deceased = $deceased; } public function getEmail() { return $this->email; } public function setEmail($email) { $this->email = $email; } public function getRules() { return [ 'name' => 'trim|alpha|length(2,50)', 'age' => 'trim|int|between(0,110)|cast(int)', 'gender' => 'trim|value(M,F)', 'deceased' => 'trim|boolean|cast(boolean)', 'email' => 'optional|trim|email', ]; } }
安装
您可以使用依赖管理工具 Composer 安装 Filter 组件。运行 require 命令以解决和下载依赖项。
composer require gobline/filter