如何解决Laravel:PHP特性可以向模型的受保护值添加值
我正在使用Laravel 7,目前正在尝试通过使用PHP特性集中一些代码。但是,我想拥有例如还将值添加到protected $attributes
变量或protected $with
变量中。
我为什么要那样?因为我想重复使用代码,而不是告诉每个Laravel模型在哪里使用我的特征来加载关系并将属性添加到模型中。那将是多余的...
我已经想出了一种向protected $attributes
变量添加值的方法。但是,如何将comments
添加到我的protected $with
变量中?
这是将值添加到protected $attributes
变量的代码:
/* Add attributes to model $appends */
protected function getArrayableAppends()
{
$this->appends = array_unique(array_merge($this->appends,['publishedComments']));
return parent::getArrayableAppends();
}
亲切的问候
解决方法
模型所使用的特性可以被“引导”和“初始化”。引导通常是一种调整行为的静态方法。初始化是在模型的每个新实例上完成的,这就是您想使用的:
protected function initializeYourTraitName()
{
// do what you need to merge into $this->appends
// do what you need to merge in new values to $this->with
}
如果您检查Illuminate\Database\Eloquent\Model
的构造函数,则会看到对initializeTraits
的调用。
您还需要定义一种启动特征的方法,该方法将使模型意识到应该在模型的每个新实例上调用的“初始化”方法。
protected static function bootYourTraitName()
{
$class = static::class;
$method = "initializeYourTraitName";
static::$traitInitializers[$class][] = $method;
static::$traitInitializers[$class] = array_unique(
static::$traitInitializers[$class]
);
}
这些是你特质的方法。
您必须将YourTraitName
部分更改为特征的名称。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。