actengage / roles
A simple role management package for 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
A simple package for assigning many-to-many "roles" to Eloquent models. This packages provides the migrations, a config file, a Role model, a Roleable trait, and an ability to sync the roles from a config to the database.
Installation
composer require actengage/roles
Implementation
To implement Roles, you just need to assign the Roleable
trait to the model
receiving the roles.
namespace App\User;
use Actenage\Roles\Roleable;
use Illuminate\Database\Eloquent\Model;
class User extends Model {
use Roleable;
}
Gates & Policies
Roles are meant to be used directly within Laravel Gates and Policies.
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;
}
}
Basic Example
$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`
Parent/Child Roles
$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`