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

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

This package is auto-updated.

Last update: 2024-09-26 04:40:54 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',

用法

以下示例使用Facade样式(Filter::filter())以简化说明 - 独立用户应将其扩展到$filter->filter()

独立类类似于Laravel的validator组件

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