actengage/roles

一个简单的 Laravel 角色管理包。

v2.0.0 2022-04-07 17:08 UTC

README

这是一个简单包,用于将多对多“角色”分配给 Eloquent 模型。此包提供了迁移、配置文件、角色模型、可分配给模型的 Roleable 特性和从配置同步到数据库的能力。

安装

composer require actengage/roles

实现

要实现角色功能,只需将 Roleable 特性分配给接收角色的模型。

namespace App\User;

use Actenage\Roles\Roleable;
use Illuminate\Database\Eloquent\Model;

class User extends Model {

    use Roleable;

}

门和策略

角色旨在直接在 Laravel 门和策略中使用。

Gate::define('sudo', function ($user, $model) {
    return $user->hasRole(Role::findByName('account_owner'));
});
<?php

namespace App\Policies;

use App\User;
use App\Post;

class PostPolicy
{
    /**
     * If the user an account owner, the policy should always pass.
     *
     * @param  \App\User  $user
     * @param  \App\Post  $ability
     * @return bool
     */
    public function before($user, $ability)
    {
        // isSuperAdmin() is a helper function provided by the Roleable trait.
        // Which is a shortcut to: $user->hasRole(Role::findByName('account_owner'));
        if ($user->isSuperAdmin()) {
            return true;
        }
    }

    /**
     * Determine if the given post can be updated by the user.
     *
     * @param  \App\User  $user
     * @param  \App\Post  $post
     * @return bool
     */
    public function update(User $user, Post $post)
    {
        return $user->id === $post->user_id;
    }
}

基本示例

$role = Role::findByName('account_owner');

$user = User::findOrFail(1);
$user->grantRole($role);

dd($user->hasRole($role)); // returns -> `true`

$user->revokeRole($role);

dd($user->hasRole($role)); // returns -> `false`

父子角色

$role = Role::findByName('account_owner');

$childRole = Role::create([
    'name' => 'Child Role',
    'parent_id' => $role->id
]);

$user = User::findOrFail(1);
$user->grantRole($childRole);

dd($user->hasRole($role)); // returns -> `true`
dd($user->hasRole($childRole)); // returns -> `true`

$user->revokeRole($childRole);

dd($user->hasRole($role)); // returns -> `true`
dd($user->hasRole($childRole)); // returns -> `false`