为什么我们只有这种静态方式来启动Laravel中的特征:
tMSSqlSP
有没有办法启动trait并在启动函数中有模型实例?像这样:
static function bootMyTrait ()
{...}
我需要这个AF,并且很长一段时间没有找到任何解决方案。
答案 0 :(得分:2)
自Laravel 5.7起,您可以使用特征 initializers ,而不是特征 booters 。我完成了相同的任务,并能够像这样解决它:
public function initializeMyTrait()
{
if ($this instanceOf awesomeInterface)
{
$this->append('nice_attribute');
}
}
答案 1 :(得分:0)
好吧,似乎没有人关心:D
好消息是,在15分钟内,我已经在基础模型中解决了我的问题:
box = document.getElementById("box");
box.addEventListener("click, function(event) {
event.target.classList.toggle("clicked");
}
修改强>
不要依赖于特征,而是使用Eloquent的访问者和变异者。例如,在public function __construct(array $attributes = [])
{
foreach (class_uses_recursive($this) as $trait)
{
if (method_exists($this, $method = 'init'.class_basename($trait))) {
$this->{$method}();
}
}
parent::__construct($attributes);
}
模型上定义以下方法:
User
这会将// Any time `$user->first_name` is accessed, it will automatically Uppercase the first letter of $value
public function getFirstNameAttribute($value)
{
return ucfirst($value);
}
属性附加到模型中。通过在方法名前加上$user->first_name
作为前缀,并在其后加get
,你告诉Eloquent,嘿,这是我模型的实际属性。它不需要存在于桌面上。
另一方面,你可以定义一个mutator:
Attribute
这将在// Any string set as first_name will automatically Uppercase words.
public function setFirstNameAttribute($value)
{
$this->attributes['first_name'] = ucwords($value);
}
数组中设置之前对$value
执行任何操作。
当然,您可以将这些应用于数据库表中存在的属性。如果您有原始的,未格式化的数据,例如电话号码1234567890,并且您想要应用国家/地区代码,则可以使用访问器方法来屏蔽该数字,而无需修改数据库中的原始值。另一方面,如果您想将标准格式应用于某个值,则可以使用mutator方法,以使所有数据库值符合通用标准。