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



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

现在我想在调用$model->toArray()时从模型中隐藏translation_of字段,这是通过将其添加到 $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';
    }
    

    由于范围的原因,这也(正如我怀疑的那样)是不允许的。

有什么想法可以做到这一点吗?

请帮忙!


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

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

您可以覆盖实际使用$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);
    }
}

最新更新