macellan/filter

使输入和输出过滤Eloquent模型变得容易

v1.2.0 2019-09-06 19:41 UTC

This package is auto-updated.

Last update: 2024-09-08 07:10:31 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');

规则也类似于Validator构建

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') 或通过外观 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许可证下发布。