Laravel - 在存储库中实现雄辩的关系

时间:2016-12-19 08:04:30

标签: php laravel-5 eloquent repository-pattern

我有3个用于管理用户权限的模型。

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();
}

但它不会工作,因为Permission的角色方法不能静态调用。感谢。

1 个答案:

答案 0 :(得分:1)

事实上,在我看来,你不应该在存储库中实现它。当你打电话

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

您正在获取权限对象,因此无需在存储库中实现它。您只需要运行:

$roles = $permission->roles;

理论上,您可以将此示例添加到PermissionRepository方法中,如下所示:

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

所以你现在可以运行

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

获得给定权限的角色,但我没有看到这样做的任何意义。