Installation:
composer require leoche/laravel-lpermissions:1.0
Add the service provider to config/app.php under providers:
Leoche\LPermissions\LPermissionsServiceProvider::class,
Publish and run migrations:
php artisan vendor:publish --provider="Leoche\LPermissions\LPermissionsServiceProvider"
php artisan migrate
First Use Case:
use Leoche\LPermissions\LPermissions;
$user = User::find(1);
$user->assignRole('admin'); // 'admin' must exist in the `roles` table
Route::get('/admin', ['middleware' => 'role:admin', function() {
return 'Admin Dashboard';
}]);
Where to Look First:
database/migrations/ for roles, permissions, and role_user tables.role middleware is auto-registered in app/Http/Kernel.php.@can and @cannot directives in the package’s Blade helpers.Role Assignment:
$user->assignRole('editor');
$user->assignRole(['editor', 'moderator']);
$user->removeRole('editor');
Permission Management:
$role = Role::findByName('admin');
$role->attachPermission('create_post');
Route::get('/posts/create', ['middleware' => 'permission:create_post', function() {
return 'Create Post';
}]);
Blade Integration:
@can('edit_post')
<button>Edit Post</button>
@endcan
@role('admin')
<div>Admin Panel</div>
@endrole
Policy Integration:
use Leoche\LPermissions\Traits\HasPermissions;
class Post extends Model {
use HasPermissions;
}
config/lpermissions.php:
'permissions' => [
'posts' => ['create', 'edit', 'delete'],
],
auth):
Route::get('/admin', ['middleware' => ['auth', 'role:admin'], function() {
return 'Admin Area';
}]);
Gate::before() to dynamically override permissions:
Gate::before(function ($user, $ability) {
if ($user->isSuperAdmin()) {
return true;
}
});
$role = Role::create(['name' => 'admin']);
$role->attachPermission(['create_post', 'delete_post']);
Laravel Version Lock:
spatie/laravel-permission) for Laravel 5.5+.Migration Conflicts:
roles or permissions tables already exist, migrations may fail.Middleware Not Auto-Registered:
role and permission middleware must be manually added to app/Http/Kernel.php:
'role' => \Leoche\LPermissions\Middleware\RoleMiddleware::class,
'permission' => \Leoche\LPermissions\Middleware\PermissionMiddleware::class,
Case Sensitivity:
role:Admin ≠ role:admin).config/lpermissions.php.No Built-in Permission Groups:
spatie/laravel-permission, this package lacks permission grouping (e.g., posts.create).posts.create) and handle in middleware.dd(auth()->user()->roles); // Debug assigned roles
Kernel.php and routes use the correct key:
Route::get('/test', ['middleware' => 'role:admin']); // Correct
Route::get('/test', ['middleware' => 'RoleMiddleware']); // Incorrect
hasPermission method in a trait to log failed checks:
trait LogPermissionChecks {
public function hasPermission($permission) {
$result = parent::hasPermission($permission);
if (!$result) {
Log::warning("Permission denied: {$permission} for user " . $this->id);
}
return $result;
}
}
Custom Middleware: Extend the base middleware to add logic:
namespace App\Http\Middleware;
use Closure;
class CustomRoleMiddleware {
public function handle($request, Closure $next, $role) {
if (auth()->user()->hasRole($role) && auth()->user()->isActive()) {
return $next($request);
}
abort(403);
}
}
Register in Kernel.php:
'customrole' => \App\Http\Middleware\CustomRoleMiddleware::class,
Blade Extensions:
Add custom directives (e.g., @hasanyrole):
Blade::directive('hasanyrole', function ($roleList) {
return "<?php if(auth()->user()->hasAnyRole({$roleList})): ?>";
});
Usage:
@hasanyrole(['admin', 'editor'])
<div>Restricted Content</div>
@endhasanyrole
Database Schema:
Extend the role_user pivot table to store metadata (e.g., assigned_at):
Schema::table('role_user', function (Blueprint $table) {
$table->timestamp('assigned_at')->useCurrent();
});
Update the assignRole method in the package’s User model trait.
web guard. For API routes, specify the guard in middleware:
Route::middleware(['auth:api', 'role:admin'])->group(function () {
// API routes
});
hasPermission method:
public function hasPermission($permission) {
return cache()->remember("user_{$this->id}_permissions", 60, function() use ($permission) {
return $this->roles->contains('permissions.name', $permission);
});
}
How can I help you explore Laravel packages today?