bcalik/filter

简化输入和输出过滤Eloquent模型

v1.1.0 2017-03-27 20:58 UTC

This package is not auto-updated.

Last update: 2024-09-14 20:40:46 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' => 'upper|trim',
        'city' => 'trim'
    ];

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

也可以独立使用

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

安装

通过composer安装

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

Laravel 4

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

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

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

用法

以下示例使用外观样式(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::registerFilter('slugify', function($str, array $args) {
    return preg_replace('/[^a-z0-9]+/', '-', strtolower($str));
});

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

可以使用 Filter::unregisterFilter('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)
slug        Str::slug($str)
null        empty($str) ? null : $str

Laravel 4

有一个特质,HasFilters 可用,它修改了 getAttribute(访问器)和 setAttribute(修改器)来应用过滤器到输入或输出值。

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

class Address extends Model {
    use Filter\HasFilters;

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

可以使用 App::make('filter') 获取过滤器实例,或者根据 config/app.php 中的设置,通过外观 Filter 获取。

调用链

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

  • 修改器: $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许可下发布。