解决 Entrust 的 Trait 冲突
解决 Entrust 的 Trait 冲突
mylegendary 发表于11个月前
解决 Entrust 的 Trait 冲突
  • 发表于 11个月前
  • 阅读 5
  • 收藏 0
  • 点赞 0
  • 评论 0

标题:腾讯云 新注册用户域名抢购1元起>>>   

摘要: Laravel 社区拿来的,好帖,留作纪念!多个trait有方法命名冲突时,采取别名方式解决。

当使用的多个 trait 中包含了相同的方法名,将会发生冲突,冲突错误信息如下:

FatalErrorException in User.php line 43:
Trait method xxxxxx has not been applied, because there are collisions with other trait methods on App\Http\models\User

和 SoftDeletes 的 restore 冲突

由于 EntrustUserTrait 和 SoftDeletes 两个 trait 都包含 restore 方法,所以当我们对用户 Model 使用软删除的时候同时集成 Entrust 的时候就会导致冲突。

解决方法就是引用两个 trait 时为 restore 方法设置别名,然后重写一个 restore 方法,分别调用两个restore 方法。代码如下:

class User extends Model implements AuthenticatableInterface
{
    use Authenticatable;
    use EntrustUserTrait { EntrustUserTrait::restore as private restoreA; }
    use SoftDeletes { SoftDeletes::restore as private restoreB; }

    /**
     * 解决 EntrustUserTrait 和 SoftDeletes 冲突
     */
    public function restore()
    {
        $this->restoreA();
        $this->restoreB();
    }
}

和 Authorizable 的 can 冲突

解决办法是将 EntrustUserTrait 的 can 方法改一个别名,然后使用 Authorizable 中的 can,代码如下

use Authenticatable, CanResetPassword, PresentableTrait, Authorizable, EntrustUserTrait {
    EntrustUserTrait::can as may;
    Authorizable::can insteadof EntrustUserTrait;
}

 

共有 人打赏支持
粉丝 0
博文 14
码字总数 2994
×
mylegendary
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: