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

问题描述 投票:0回答:1

我有一个名为

Multilingual
的特征,它使用模型的
lang
translation_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';
    }
    

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

有什么干净的方法来做到这一点的想法吗?

请帮忙!


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

  1. 内部:
    $this->hidden[] = 'translation_of';
  2. 外部:
    $model->setHidden(array_merge($model->getHidden(), ['translation_of']));
php laravel eloquent model traits
1个回答
6
投票

您可以重写实际使用

$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);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.