友達が【ここ】に質問してきたので、以前たまたま遭遇したので記録しました。
使用される複数のトレイトに同じメソッド名が含まれている場合、競合が発生します。 競合エラー メッセージは次のとおりです。
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
Due EntrustUserTrait と SoftDeletes の両方の特性に復元メソッドが含まれているため、ユーザー モデルで論理的な削除を使用し、同時に Entrust を統合すると、競合が発生します。
解決策は、2 つの特性を参照するときに復元メソッドのエイリアスを設定し、復元メソッドを書き換えて 2 つの復元メソッドをそれぞれ呼び出すことです。コードは次のとおりです。
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(); }}
解決策は、EntrustUserTrait の can メソッドをエイリアスに変更し、Authorizable で can を使用することです。コードは次のとおりです
use Authenticatable, CanResetPassword, PresentableTrait, Authorizable, EntrustUserTrait { EntrustUserTrait::can as may; Authorizable::can insteadof EntrustUserTrait;}
参考: Laravel 5.1.11 - AppUser で他の特性メソッドと衝突があるため、特性メソッドは適用されていません