actengage / roles
一个简单的 Laravel 角色管理包。
v2.0.0
2022-04-07 17:08 UTC
Requires
- php: ^8.0
- actengage/sluggable: ^2.0
- laravel/framework: ^9.0
Requires (Dev)
- mockery/mockery: ^1.1
- orchestra/testbench: ^7.0
- phpunit/phpunit: ^9.5
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`