如何在特征中配置Laravel模型属性?

时间:2014-12-29 16:48:31

标签: laravel model attributes eloquent traits

我有一个名为Multilingual的特征,它使用模型langtranslation_of属性(另见https://stackoverflow.com/a/7299777/1453912)来提供实体的多个翻译。

现在,我希望在调用translation_of时隐藏模型中的$model->toArray()字段,最简单的方法是将其添加到$hidden属性中。像这样:

class Model {
    use Multilingual;

    protected $hidden = ['translation_of'];
}

但为了保持原始模型的清洁,我想通过使用的特性添加隐藏字段。

我试过了:

  1. protected $hidden = ['translation_of'];添加到特征中,这是不允许的:Undefined: trait declaration of property 'hidden' is incompatible with previous declaration

    并且也不是非常可扩展(它会被类的$hidden属性覆盖,我认为..)

  2. 为特征添加引导方法:

    static function bootMultilingual() {
        static::$hidden[] = 'translation_of';
    }
    

    由于范围的原因,我也不允许(因为我怀疑)。

  3. 干净的方法有什么想法吗?

    请帮忙!


    注意:为了保持动态,我认为可以通过两种方式完成:

    1. 内部:$this->hidden[] = 'translation_of';
    2. 外部:$model->setHidden(array_merge($model->getHidden(), ['translation_of']));

1 个答案:

答案 0 :(得分:3)

您可以覆盖实际使用$this->hidden的方法。这是getArrayableItems

trait Multilingual {

    protected function getArrayableItems(array $values)
    {
        if(!in_array('translation_of', $this->hidden)){
            $this->hidden[] = 'translation_of';
        }
        return parent::getArrayableItems($values);
    }
}