2016-12-19 8 views
1

私は3つのモデルを持っています。Laravel - リポジトリ内で雄弁な関係を実現する

class User extends Authenticatable 
{ 
    public function roles() 
    { 
     return $this->belongsToMany('App\Models\Role'); 
    } 
} 

class Role extends Model 
{ 
    public function users() 
    { 
     return $this->belongsToMany('App\Models\User'); 
    } 

    public function permissions() 
    { 
     return $this->belongsToMany('App\Models\Permission'); 
    } 
} 

class Permission extends Model 
{ 
    public function roles() 
    { 
     return $this->belongsToMany('App\Models\Role'); 
    } 

    public function roleHavePermission(Role $role) 
    { 
     if ($this->roles()->find($role->id)) { 
      return true; 
     } 

     return false; 
    } 

    public function userHavePermission(User $user = null) 
    { 
     $roles = []; 

     if (is_null($user)) { 
      $roles[] = Role::where('slug', 'guest')->first(); 
     } else { 
      foreach ($user->roles as $role) { 
       $roles[] = $role; 
      } 
     } 

     foreach ($roles as $role) { 
      if ($this->roleHavePermission($role)) { 
       return true; 
      } 
     } 

     return false; 
    } 
} 

私のアプリケーションが成長したので、私はリポジトリに移動します。たとえば、これは私のPermissionRepositoryです:

class PermissionRepository implements PermissionRepositoryInterface 
{ 
    protected $roleRepository; 

    /** 
    * PermissionRepository constructor. 
    * @param RoleRepositoryInterface $roleRepository 
    */ 
    public function __construct(RoleRepositoryInterface $roleRepository) 
    { 
     $this->roleRepository = $roleRepository; 
    } 

    public function action($routeName) 
    { 
     return Permission::where('action', $routeName)->first(); 
    } 
} 

どのように私は、このリポジトリにroleHavePermissionuserHavePermissionを実装することができますか?私はこの構文でroles方法実装しようとした:

public function roles() 
{ 
    return Permission::roles(); 
} 

をしかし許可の役割メソッドが静的にコールすることはできませんので、それは動作文句を言いません。ありがとう。

答えて

1

私の意見では、実際にはリポジトリに実装しないでください。あなたが電話するとき

$permission = $permissionRepository->action('abc.name'); 

あなたは許可オブジェクトを取得しているので、それをリポジトリに実装する必要はありません。必要なのは実行されている。理論的には

$roles = $permission->roles; 

をあなたはこのようPermissionRepository方法に例えば追加できますので、あなたが今、与えられたの役割を取得するために

$roles = $permissionRepository->getRoles($permission); 

を実行することができ

public function getRoles(Permission $permission) 
{ 
    return $permission->roles; 
} 

私はこのようなことはしていない。

+0

恐ろしい!ありがとうございました! – ma3x