在Laravel中,我如何非静态启动特征

时间:2018-02-02 15:35:57

标签: php laravel model eloquent traits

为什么我们只有这种静态方式来启动Laravel中的特征:

tMSSqlSP

有没有办法启动trait并在启动函数中有模型实例?像这样:

static function bootMyTrait ()
{...}

我需要这个AF,并且很长一段时间没有找到任何解决方案。

2 个答案:

答案 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方法,以使所有数据库值符合通用标准。

Laravel Accessor and Mutators