Php 在Laravel中,如何以非静态方式启动trait

Php 在Laravel中,如何以非静态方式启动trait,php,laravel,model,eloquent,traits,Php,Laravel,Model,Eloquent,Traits,为什么我们在Laravel中只有这种静态引导特性的方法 static function bootMyTrait () {...} 有没有办法引导trait并在引导函数中包含model实例?像这样: function bootMyTrait () { if ($this instanceOf awesomeInterface) { $this->append('nice_attribute'); } } 我需要这个AF,很长一段时间没有找到任何解决

为什么我们在Laravel中只有这种静态引导特性的方法

static function bootMyTrait ()
{...}
有没有办法引导trait并在引导函数中包含model实例?像这样:

function bootMyTrait ()
{
    if ($this instanceOf awesomeInterface)
    {
        $this->append('nice_attribute');
    }
}

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

好吧,似乎没有人关心:D

好消息是,在15分钟内,我解决了基本模型中的问题:

编辑

与其依赖特征,不如使用雄辩的访问器和变异器。例如,在用户模型上定义以下方法:

这会将$user->first\u name属性附加到模型。通过使用get作为方法名的前缀,并使用Attribute作为其后缀,您正在告诉Elount,嘿,这是我的模型上的一个实际属性。它不需要存在于桌面上

另一方面,您可以定义一个变体:

// Any string set as first_name will automatically Uppercase words.
public function setFirstNameAttribute($value)
{
    $this->attributes['first_name'] = ucwords($value);
}
在$attributes数组中设置$value之前,这将对$value应用您所做的任何操作

当然,您可以将这些属性应用于数据库表中确实存在的属性。如果您有未格式化的原始数据,例如电话号码1234567890,并且希望应用国家/地区代码,则可以使用访问器方法屏蔽该号码,而无需修改数据库中的原始值。另一方面,如果希望对值应用标准格式,可以使用mutator方法使所有数据库值都符合公共标准


嗯,似乎没人在乎:D

好消息是,在15分钟内,我解决了基本模型中的问题:

编辑

与其依赖特征,不如使用雄辩的访问器和变异器。例如,在用户模型上定义以下方法:

这会将$user->first\u name属性附加到模型。通过使用get作为方法名的前缀,并使用Attribute作为其后缀,您正在告诉Elount,嘿,这是我的模型上的一个实际属性。它不需要存在于桌面上

另一方面,您可以定义一个变体:

// Any string set as first_name will automatically Uppercase words.
public function setFirstNameAttribute($value)
{
    $this->attributes['first_name'] = ucwords($value);
}
在$attributes数组中设置$value之前,这将对$value应用您所做的任何操作

当然,您可以将这些属性应用于数据库表中确实存在的属性。如果您有未格式化的原始数据,例如电话号码1234567890,并且希望应用国家/地区代码,则可以使用访问器方法屏蔽该号码,而无需修改数据库中的原始值。另一方面,如果希望对值应用标准格式,可以使用mutator方法使所有数据库值都符合公共标准

因为您可以使用trait初始值设定项,而不是trait引导项。我也有同样的任务,并且能够像这样解决它:

public function initializeMyTrait()
{
    if ($this instanceOf awesomeInterface)
    {
        $this->append('nice_attribute');
    }
}
因为您可以使用trait初始值设定项,而不是trait引导项。我也有同样的任务,并且能够像这样解决它:

public function initializeMyTrait()
{
    if ($this instanceOf awesomeInterface)
    {
        $this->append('nice_attribute');
    }
}

你能重新措辞这个问题吗?就我个人而言,我搞不懂你在问什么。@JonStirling哦,对不起,问题中有问题和拼写错误。修好了。我希望现在更清楚了。你能把问题的措辞改一下吗?就我个人而言,我搞不懂你在问什么。@JonStirling哦,对不起,问题中有问题和拼写错误。修好了。我希望现在更清楚。我很好奇,在非静态环境中需要它的用例是什么?@btl如果你看我的问题,你可以看到确切的用例:将属性附加到Elounce。如果您不太熟悉Laravel,那么在普通PHP用例中,可能会向对象添加必要的属性,或者更改其属性的值,例如,如果某些条件(如implements Interface)为真。现在我想问你,这些用例不是合法的吗?我是不是做错了什么傻事了?是的,你想用模型访问器,而不是用特性。我会用一个例子来编辑你的答案。现在就看答案的峰值。比使用特性更简单更干净。@btl哦,谢谢你,伙计。然而,我的意图是使用trait+接口逻辑:trait由基础模型使用,任何其他模型都会扩展它。然后,如果某个特定的模型应该实现特征逻辑,那么write将实现SomeInterface。接下来,在initSomeTrait中,检查模型是否实现了SomeInterface,如果是,则附加必要的属性并执行其他操作。也许一开始我没有说清楚,是我的错。但这超出了问题的范围:无论如何,谢谢兄弟!我很好奇,在非静态环境中需要它的用例是什么?@btl如果你看我的问题,你可以看到确切的用例:将属性附加到雄辩。如果您不太熟悉Laravel,那么在普通PHP用例中,可能会向对象添加必要的属性,或者更改其属性的值,例如,如果某些条件(如implements Interface)为真。现在我想问你,这些用例不是合法的吗?我是不是做错了什么傻事了?是的,你想用模型访问器,而不是用特性。我会用一个例子来编辑你的答案。现在就看答案的峰值。很容易
比使用特性更简单更干净。@btl哦,谢谢你,伙计。然而,我的意图是使用trait+接口逻辑:trait由基础模型使用,任何其他模型都会扩展它。然后,如果某个特定的模型应该实现特征逻辑,那么write将实现SomeInterface。接下来,在initSomeTrait中,检查模型是否实现了SomeInterface,如果是,则附加必要的属性并执行其他操作。也许一开始我没有说清楚,是我的错。但这超出了问题的范围:无论如何,谢谢兄弟!