我有一个名为Multilingual
的特征,它使用模型的lang
和translation_of
属性(另见 https://stackoverflow.com/a/7299777/1453912)来提供实体的多个翻译。
现在我想在调用$model->toArray()
时从模型中隐藏translation_of
字段,这是通过将其添加到 $hidden
属性最容易完成的。喜欢这个:
class Model {
use Multilingual;
protected $hidden = ['translation_of'];
}
但是为了保持原始模型的清洁,我想通过使用的特征添加隐藏字段。
我试过:
向特征添加
protected $hidden = ['translation_of'];
,这是不允许的:Undefined: trait declaration of property 'hidden' is incompatible with previous declaration
而且也不是很可扩展(我认为它将被类的
$hidden
属性覆盖......向特征添加引导方法:
static function bootMultilingual() { static::$hidden[] = 'translation_of'; }
由于范围的原因,这也(正如我怀疑的那样)是不允许的。
有什么想法可以做到这一点吗?
请帮忙!
注意:为了保持动态,我认为可以通过两种方式完成:
- 内部:
$this->hidden[] = 'translation_of';
- 外部:
$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);
}
}