我有一个名为Multilingual
的特征,它使用模型lang
和translation_of
属性(另见https://stackoverflow.com/a/7299777/1453912)来提供实体的多个翻译。
现在,我希望在调用translation_of
时隐藏模型中的$model->toArray()
字段,最简单的方法是将其添加到$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']));
答案 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);
}
}