Installation:
composer require konekt/acl
Publish the migration and config:
php artisan vendor:publish --provider="Konekt\Acl\AclServiceProvider" --tag="migrations"
php artisan vendor:publish --provider="Konekt\Acl\AclServiceProvider" --tag="config"
Run migrations:
php artisan migrate
Model Setup:
Ensure your User model uses Konekt\Acl\Concord\Models\ConcordUser as a trait:
use Konekt\Acl\Concord\Models\ConcordUser;
class User extends Authenticatable
{
use ConcordUser;
// ...
}
First Use Case: Define a role and assign permissions:
use Konekt\Acl\Concord\Models\ConcordRole;
$role = ConcordRole::create(['name' => 'admin']);
$role->givePermissionTo('access dashboard');
Assign the role to a user:
$user->assignRole('admin');
Check permissions in Blade:
@can('access dashboard')
<button>Go to Dashboard</button>
@endcan
Permission Management:
$permission = \Konekt\Acl\Concord\Models\ConcordPermission::create(['name' => 'manage users']);
$role->givePermissionTo(['create posts', 'delete posts']);
Role Hierarchies:
admin inherits from editor):
$adminRole = ConcordRole::create(['name' => 'admin']);
$editorRole = ConcordRole::create(['name' => 'editor']);
$adminRole->assignRole($editorRole); // Admin inherits editor permissions
Policy Integration:
// app/Policies/PostPolicy.php
public function update(User $user, Post $post)
{
return $user->can('edit posts');
}
Middleware:
Route::get('/admin', function () {
// ...
})->middleware('can:access dashboard');
Concord Compliance:
// In a Concord module's boot method
$this->acl()->role('editor')->givePermissionTo('publish content');
Seeding Permissions: Use a seeder to initialize roles/permissions:
public function run()
{
$admin = ConcordRole::create(['name' => 'admin']);
$admin->givePermissionTo(['access dashboard', 'manage users']);
}
API Authorization:
Use can in API controllers:
public function destroy(Post $post)
{
$this->authorize('delete', $post); // Uses Laravel's authorize helper
// OR
if (!$this->user()->can('delete posts')) {
abort(403);
}
}
Caching: Cache role-permission mappings for performance:
\Konekt\Acl\Concord\Facades\Acl::cacheRolesAndPermissions();
Migration Conflicts:
php artisan migrate:reset
php artisan migrate
Permission Caching:
php artisan cache:clear
\Konekt\Acl\Concord\Facades\Acl::clearCachedPermissions();
Case Sensitivity:
define('PERMISSION_EDIT_ARTICLES', 'edit articles');
Role Assignment:
assignRole for hierarchical roles:
// Correct (respects hierarchy)
$user->assignRole('admin');
// Avoid (skips hierarchy)
$user->roles()->attach($adminRole->id);
Concord Module Isolation:
Check Permissions: Dump a user’s permissions:
dd($user->getAllPermissions()->pluck('name'));
Gate Debugging: Enable Laravel’s gate debugging:
Gate::inspect();
Log Middleware: Add middleware to log permission checks:
public function handle($request, Closure $next)
{
if ($request->user() && $request->user()->can('log permission checks')) {
\Log::info('Permission check:', ['user' => $request->user()->id, 'permission' => $request->route()->getName()]);
}
return $next($request);
}
Custom Permission Models:
Extend ConcordPermission or ConcordRole:
class CustomPermission extends \Konekt\Acl\Concord\Models\ConcordPermission
{
protected $table = 'custom_permissions';
}
Event Listeners: Listen for permission/role events:
// app/Providers/EventServiceProvider.php
protected $listen = [
\Konekt\Acl\Events\RoleCreated::class => [
\App\Listeners\LogRoleCreation::class,
],
];
Custom Guards:
Override the default guard in config/acl.php:
'guard_name' => 'admin',
API Resources: Extend ACL models in API resources:
public function toArray($request)
{
return [
'id' => $this->id,
'name' => $this->name,
'permissions' => $this->permissions->pluck('name'),
];
}
Testing:
Use ConcordTestingTrait for tests:
use Konekt\Acl\Concord\Testing\ConcordTestingTrait;
class PermissionTest extends TestCase
{
use ConcordTestingTrait;
public function test_user_has_permission()
{
$user = $this->createUserWithRole('admin');
$this->assertTrue($user->can('access dashboard'));
}
}
How can I help you explore Laravel packages today?