我有一个名为
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']));
您可以重写实际使用
$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);
}
}