l5starter/permission-manager
Laravel 5.4 permission/role manager for L5Starter Admin, built on spatie/laravel-permission. Provides migrations, seeders, and admin UI/menu entries for managing roles and permissions; add HasRoles to User and protect routes with a simple role middleware.
Installation
composer require l5starter/permission-manager:5.4.x-dev
Add to config/app.php:
'providers' => [
Spatie\Permission\PermissionServiceProvider::class,
L5Starter\PermissionManager\PermissionManagerServiceProvider::class,
],
Publish Assets Run migrations and seeders:
php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" --tag="migrations"
php artisan migrate
php artisan vendor:publish --provider="L5Starter\PermissionManager\PermissionManagerServiceProvider" --tag="seeder"
php artisan db:seed --class=RolesTableSeeder
User Model Integration
Add trait to app/User.php:
use Spatie\Permission\Traits\HasRoles;
use L5Starter\PermissionManager\Traits\HasPermissions; // If using custom permissions
First Use Case Assign a role to a user:
$user = User::find(1);
$user->assignRole('admin');
Role-Based Access Control (RBAC)
$user->assignRole('editor')$user->hasRole('editor')$user->removeRole('editor')$user->rolesPermission Management
$user->givePermissionTo('edit_articles')$user->can('edit_articles')$user->revokePermissionTo('edit_articles')$user->getAllPermissions()Middleware Integration Use built-in middleware for route protection:
Route::get('/admin', function () {
// ...
})->middleware(['role:admin', 'permission:edit_articles']);
Admin Panel Integration
sidebar.blade.php (as shown in README) for UI navigation.admin.roles.index, admin.permissions.index) for CRUD operations.Policy Integration Extend Laravel’s policies with permission checks:
public function update(User $user, Article $article)
{
$this->authorize('edit_articles');
// ...
}
Dynamic Permissions: Create permissions on-the-fly:
$permission = Permission::create(['name' => 'manage_users']);
$user->givePermissionTo($permission);
Role Hierarchies: Define parent-child relationships:
$adminRole = Role::create(['name' => 'admin']);
$editorRole = Role::create(['name' => 'editor']);
$editorRole->setParent($adminRole);
Gate Integration:
Gate::define('edit_articles', function ($user) {
return $user->hasPermissionTo('edit_articles');
});
Migration Conflicts
permission package directly, avoid duplicate migrations. This package extends Spatie’s functionality, so ensure spatie/laravel-permission is not installed separately.Seeder Overrides
RolesTableSeeder may conflict with existing seeders. Review and merge logic if custom roles/permissions exist.Route Caching
php artisan route:clear
Permission Caching
php artisan cache:clear
Namespace Collisions
L5Starter\PermissionManager doesn’t conflict with other PermissionManager classes in your project.dd($user->roles, $user->getAllPermissions());
throws block in middleware to log denied access:
public function handle($request, Closure $next)
{
if (!auth()->user()->hasRole('admin')) {
Log::warning('Unauthorized access attempt: ' . $request->path());
abort(403);
}
return $next($request);
}
Custom Permission Models
Extend the Permission model or use traits to add custom logic:
class CustomPermission extends \Spatie\Permission\Models\Permission
{
public function scopeActive($query)
{
return $query->where('is_active', true);
}
}
API Resources Create custom API resources for roles/permissions:
namespace App\Http\Resources;
use L5Starter\PermissionManager\Models\Role;
use Illuminate\Http\Resources\Json\JsonResource;
class RoleResource extends JsonResource
{
public function toArray($request)
{
return [
'id' => $this->id,
'name' => $this->name,
'permissions' => $this->permissions->pluck('name'),
];
}
}
Event Listeners Listen for role/permission changes:
// app/Providers/EventServiceProvider.php
protected $listen = [
'L5Starter\PermissionManager\Events\RoleAssigned' => [
'App\Listeners\LogRoleAssignment',
],
];
Localization
Override translations in resources/lang/en/l5starter.php:
return [
'roles' => 'Custom Role Name',
'permissions' => 'Custom Permission Name',
];
Testing Use factories or seeders to set up test users with roles/permissions:
$user = User::factory()->create();
$user->assignRole('admin');
$this->actingAs($user);
How can I help you explore Laravel packages today?