Laravel的全球变异者

时间:2014-05-09 14:50:31

标签: php laravel laravel-4

我有许多不同的位置插入和更新我的数据库的方式,我希望能够在插入数据库之前trim()用户输入。我知道在模型中我可以做类似下面的事情,但我不想为每个领域做这件事。有没有办法设置适用于所有字段的通用setter?

示例:

public function setSomFieldAttribute($value) {
     return $this->attributes['some_field'] = trim($value);
}

2 个答案:

答案 0 :(得分:6)

您可能会覆盖这些方法:

<?php

class Post extends Eloquent {

    protected function getAttributeValue($key)
    {
        $value = parent::getAttributeValue($key);

        return is_string($value) ? trim($value) : $value;
    }

    public function setAttribute($key, $value)
    {
       parent::setAttribute($key, $value);

        if (is_string($value))
        {
            $this->attributes[$key] = trim($value);
        }
    }
}

你永远不应该再获得未经修改的价值。

编辑:

在这里测试过,我没有空格:

Route::any('test', ['as' => 'test', function()
{
    $d = Post::find(2);

    $d->title_en = "  Markdown Example  ";

    dd($d);
}]);

答案 1 :(得分:5)

使用Model Events进行此操作,并在创建或更新模型时在每个字段上运行trim

class Model extends \Eloquent {
    ...
    public static function boot() {
        parent::boot();

        static::saving(function($model){
            $model->some_field = trim($model->some_field);
        });
    }
    ...
}

使用示例:

$model = new Model;
$model->some_field = '  foobar    ';
$model->save();

// $model->some_field should now be trimmed