gobline / filter

Gobline 过滤器组件

v2.0.0 2015-12-02 19:10 UTC

This package is auto-updated.

Last update: 2024-09-12 18:35:15 UTC


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