laravel-roles/src/Traits/HasPermissions.php

117 lines
3.1 KiB
PHP
Raw Normal View History

2025-06-16 07:49:36 +00:00
<?php
namespace Blax\Roles\Traits;
use Illuminate\Support\Collection;
2025-06-16 07:49:36 +00:00
trait HasPermissions
{
2025-06-19 12:45:06 +00:00
public function hasPermission(string $permission): bool
2025-06-16 07:49:36 +00:00
{
2025-06-19 12:45:06 +00:00
$allpermissions = $this->allPermissions();
2025-06-19 12:45:06 +00:00
if ($allpermissions->contains('slug', '*')) {
return true; // If any permission is '*', all permissions are granted
}
2025-06-19 12:45:06 +00:00
return $allpermissions->contains(function ($perm) use ($permission) {
return $perm->slug === $permission || $perm->name === $permission;
});
}
2025-06-19 12:45:06 +00:00
public function rolePermissions()
{
return $this->hasManyThrough(
config('roles.models.permission'),
config('roles.models.role_member'),
'member_id',
'id',
'id',
'role_id'
);
}
2025-06-19 12:45:06 +00:00
public function permissions()
{
return $this->morphToMany(
config('roles.models.permission'),
'member',
config('roles.table_names.permission_member', 'permission_member')
);
}
2025-06-19 12:52:09 +00:00
public function assignPermission($permission)
{
$permission_class = config('roles.models.permission');
if (is_numeric($permission)) {
$permission = $permission_class::find($permission);
} elseif (is_string($permission)) {
2025-06-19 13:08:49 +00:00
$permission = $permission_class::firstOrCreate([
'slug' => $permission
]);
2025-06-19 12:45:06 +00:00
}
if ($permission instanceof $permission_class) {
// Already a Permission instance
} else {
throw new \InvalidArgumentException('Permission must be a string, numeric ID, or an instance of Permission.');
}
if ($permission) {
2025-06-19 13:08:49 +00:00
$this->permissions()->syncWithoutDetaching($permission);
return true;
}
return false;
}
public function removePermission($permission): bool
{
$permission_class = config('roles.models.permission');
if (is_numeric($permission)) {
$permission = $permission_class::find($permission);
} elseif (is_string($permission)) {
$permission = $permission_class::where('slug', $permission)->first();
2025-06-19 12:45:06 +00:00
}
if ($permission) {
2025-06-19 13:08:49 +00:00
$this->permissions()->detach($permission);
return true;
}
2025-06-19 13:08:49 +00:00
return true;
}
/**
* Get all permissions directly assigned or inherited via roles.
*
* @return Collection
*/
2025-06-19 12:45:06 +00:00
public function allPermissions()
{
// Directly assigned permissions
$direct = $this->permissions()->get();
// Permissions via roles (if the roles() relation exists)
if (method_exists($this, 'roles')) {
$rolePermissions = $this->roles()
->with('permissions')
->get()
->pluck('permissions')
->flatten();
} else {
$rolePermissions = collect();
}
// Merge and dedupe by 'id'
return $direct
->merge($rolePermissions)
->unique('id')
->values();
2025-06-16 07:49:36 +00:00
}
}