欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

Laravel 5 - Trait method can has not been applied, because there are collisions with other trai 有大用

1、Laravel 5 - Trait method can has not been applied, because there are collisions with other trait methods on App\User?





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

  1. FatalErrorException in User.php line 43:
  2. 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 方法。代码如下:

  1. class User extends Model implements AuthenticatableInterface
  2. {
  3. use Authenticatable;
  4. use EntrustUserTrait { EntrustUserTrait::restore as private restoreA; }
  5. use SoftDeletes { SoftDeletes::restore as private restoreB; }
  6. /**
  7.     * 解决 EntrustUserTrait 和 SoftDeletes 冲突
  8.     */
  9. public function restore()
  10. {
  11. $this->restoreA();
  12. $this->restoreB();
  13. }
  14. }

和 Authorizable 的 can 冲突

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

  1. use Authenticatable, CanResetPassword, PresentableTrait, Authorizable, EntrustUserTrait {
  2. EntrustUserTrait::can as may;
  3. Authorizable::can insteadof EntrustUserTrait;
  4. }

2、RevisionableTrait conflicts with EntrustUserTrait?

然而EntrustUserTrait 中与RevisionableTrait 中的boot 重复造成 RevisionableTrait conflicts with EntrustUserTrait 的原因,解决办法

在user.php model 中可以使用
class User extends Authenticatable
{
    use Notifiable;
    use HasApiTokens;
    use RevisionableTrait;
    use EntrustUserTrait { 
        EntrustUserTrait::restore insteadof SoftDeletes;
        EntrustUserTrait::boot insteadof RevisionableTrait;
        }
    use SoftDeletes;
}

3、Trait method boot has not been applied, because there are collisions with other trait methods on App\Models\User?


  如果抛出了上面的 错误,就是boot重复了,可以看看第二个问题
4、The thing that bothers me is that I don't have deleted_at column in my user table?





如果出现deleted_at 错误,就是数据库少了deleted_at字段,你可以新增一个migration,添加这个字段



来自  https://blog.csdn.net/chajinglong/article/details/72729956



解决 Entrust 的 Trait 冲突

因为有朋友在问我 [here], 而我之前也正好遇到过,所以记录下。

当使用的多个 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 { restore as private restoreA; }
    use 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;
}

参考: Laravel 5.1.11 - Trait method can has not been applied, because there are collisions with other trait methods on App\User

 本帖已被设为精华帖!


来自  https://learnku.com/laravel/t/1775/resolve-entrust-trait-conflicts

普通分类: