rmasters/filter

使输入和输出过滤 Eloquent 模型变得简单

v0.1.0 2013-08-23 19:43 UTC

This package is not auto-updated.

Last update: 2024-09-23 14:23:39 UTC


README

旨在帮助您轻松过滤 Eloquent 模型的输入。

简化如下代码

class Address extends Model {
    public function setPostcodeAttribute($value) {
        $this->attributes['postcode'] = strtoupper(trim($value));
    }

    public function setCityAttribute($value) {
        $this->attributes['city'] = trim($value);
    }

    public function getCityAttribute($value) {
        return strtoupper($value);
    }
}

变为这样

class Address extends Model {
    use Filter\HasFilters

    protected $input = [
        'postcode' => 'uppercase|trim',
        'city' => 'trim'
    ];

    protected $output = [
        'city' => 'uppercase'
    ];
}

也可以独立使用

$clean = Filter::filter(['city' => 'London'], ['city' => 'trim|uppercase']);

安装

通过 composer 安装

"rmasters/filter": "dev-master",

Laravel 4

要使用 Laravel 4 的模型特性和服务,请将以下行添加到 config/app.php

'providers' => array(
    // ...
    'Filter\FilterServiceProvider',

'aliases' => array(
    // ...
    'Filter' => 'Filter\Facades\Filter',

用法

以下示例使用 Facade 风格(Filter::filter())以简化 - 独立用户应将其扩展为 $filter->filter()

独立类类似于 Laravel 的验证器组件

$filtered = Filter::filter(['name' => 'Ross'], ['name' => 'trim']);
$value = Filter::filterOne('Ross', 'trim');

规则也类似于验证器进行构建

Filter::filterOne('test', 'trim|upper');
Filter::filterOne('test...', 'rtrim:.');
Filter::filterOne('test', ['trim', 'upper']);

过滤器从左到右顺序运行。参数由 str_getcsv 解析 - 例如,要修剪逗号,使用 trim:","

注册过滤器

过滤器是一个可调用的函数,它接受输入字符串和参数数组

Filter::register('slugify', function($str, array $args) {
    return preg_replace('/[^a-z0-9]+/', '-', strtolower($str));
});

其他可调用的值是定义了 __invoke 方法的类和函数名。例如,Zend 框架的所有过滤器都实现了 __invoke,因此 'Zend\I18n\Filter\Alnum' 是一个有效的可调用。

可以使用 Filter::unregister('slugify') 注销过滤器。

默认过滤器

默认情况下,已注册以下过滤器

trim        trim($str)
trim:|,/    trim($str, '|/');
ltrim       ltrim($str)
ltrim:|,/   ltrim($str, '|/');
rtrim       rtrim($str)
rtrim:|,/   rtrim($str, '|/');
upper       strtoupper($str)
lower       strtolower($str)
capfirst    ucfirst($str)
lowerfirst  lcfirst($str)

Laravel 4

一个特质,HasFilters,可用于修改 getAttribute(访问器)和 setAttribute(修改器),以对输入或输出值应用过滤器。

这些过滤器规则指定在模型的属性上,分别对应于修改器和访问器的 $input$output

class Address extends Model {
    use HasFilters;

    public $fillable = ['line1', 'line2', 'line3', 'city', 'postcode'];
    public $input = [
        'line1' => 'trim',
        'line2' => 'trim',
        'line3' => 'trim',
        'city' => 'trim',
        'postcode' => 'uppercase|trim',
    ];
    public $output = [
        'city' => 'uppercase', // Uppercase only for display
    ];
}

可以使用 App::make('filter') 或通过 facade Filter 获取过滤器实例,具体取决于您在 config/app.php 中的配置。

调用链

您仍然可以编写自己的访问器或修改器,它们将像设置的任何过滤器一样应用。以下链发生

  • 修改器: $model->name = 'Ross'(在您的修改器之前应用过滤器)
    1. Filter\HasFilters::setAttribute
    2. Eloquent\Model::setAttribute
    3. Your\Model::setNameAttribute(如果已定义)
  • 访问器: echo $model->name(在您的访问器之后应用过滤器)
    1. Eloquent\Model::getAttribute
    2. Your\Model::getNameAttribute
    3. Filter\HasFilters::getAttribute

您不需要修改您的修改器(它们应该仍然将值存储在 $this->attributes[$name] 中)。

许可证

在 MIT 许可证下发布。