saeidsharafi/laravel-permission-generator
Installation
composer require saeidsharafi/laravel-permission-generator
php artisan vendor:publish --provider="SaeidSharafi\PermissionGenerator\PermissionGeneratorServiceProvider" --tag="config"
Configure Permissions
Edit config/permission-generator.php to define your permission structure:
'permissions' => [
'posts' => [
'actions' => ['create', 'read', 'update', 'delete'],
'scoped' => ['view_any', 'manage_any'],
],
'comments' => [
'actions' => ['create', 'read', 'update', 'delete', 'approve'],
],
'custom' => [
'moderate_content',
'manage_users',
],
],
Generate Permissions
php artisan permission:generate
This creates app/Enums/Permission.php with type-safe permission constants.
First Use Case Replace hardcoded strings with the generated enum:
use App\Enums\Permission;
// Before
$user->givePermissionTo('posts.read');
// After
$user->givePermissionTo(Permission::POSTS_READ);
Permission Definition
posts, comments) with standard CRUD actions.custom key or as standalone entries.Generating and Syncing
php artisan permission:generate to update the Permission enum.php artisan permission:sync --super-admin=admin
(Assigns all permissions to a "Super Admin" role.)Usage in Code
Permission:: + Ctrl+Space).use App\Enums\Permission;
public function handle($request, Closure $next) {
if ($request->user()->hasPermissionTo(Permission::POSTS_UPDATE)) {
return $next($request);
}
abort(403);
}
public function update(User $user, Post $post) {
return $user->hasPermissionTo(Permission::POSTS_UPDATE);
}
Scoped Permissions
scoped actions in config (e.g., view_any) to generate both:
posts.view_any (scoped permission)posts.view (standard permission).$user->hasPermissionTo(Permission::POSTS_VIEW_ANY);
Custom Permissions
'custom' => [
'moderate_content',
'CustomEnum::VALUE', // Supports custom enums
],
Permission::MODERATE_CONTENT;
// or
Permission::CUSTOM_ENUM_VALUE;
Role Assignment
Role model:
$role->givePermissionTo([
Permission::POSTS_CREATE,
Permission::COMMENTS_APPROVE,
]);
Gate/Policy Integration
Gate::define('delete-post', function (User $user, Post $post) {
return $user->hasPermissionTo(Permission::POSTS_DELETE);
});
Enum Regeneration
app/Enums/Permission.php.Spatie Permission Dependency
spatie/laravel-permission. Install it first:
composer require spatie/laravel-permission
php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"
permission:sync command will fail.Permission Naming Conflicts
posts.create vs. create_post).resource.action).Scoped Permissions Quirk
view_any) generate two entries in the enum:
POSTS_VIEW_ANYPOSTS_VIEWCustom Enum Support
CustomEnum::VALUE) must be autoloaded and available at runtime.app/Enums/ and ensure they’re imported in composer.json:
"autoload": {
"psr-4": {
"App\\Enums\\": "app/Enums/"
}
}
Database Sync Issues
permission:sync replaces existing permissions. Test in a staging environment first.--dry-run flag (if available) to preview changes:
php artisan permission:sync --dry-run
IDE Autocompletion
app/Enums/ directory as a "Sources Root" in IDE settings.composer.json:
"extra": {
"laravel": {
"enum-directories": ["app/Enums"]
}
}
Check Generated Enum
permission:generate, inspect app/Enums/Permission.php for errors.php artisan permission:generate --verbose for debug output.Verify Database Sync
permissions table:
SELECT * FROM permissions;
SELECT * FROM model_has_permissions;
Handle Missing Permissions
php artisan permission:generate
php artisan permission:sync
Permission Caching
php artisan cache:clear
php artisan config:clear
Custom Permission Logic
php artisan vendor:publish --provider="SaeidSharafi\PermissionGenerator\PermissionGeneratorServiceProvider" --tag="templates"
resources/views/vendor/permission-generator/permission.php to customize the enum structure.Dynamic Permission Generation
PermissionGenerator class:
namespace App\Services;
use SaeidSharafi\PermissionGenerator\PermissionGenerator as BaseGenerator;
class PermissionGenerator extends BaseGenerator {
public function generate(): string {
// Add dynamic logic here
return parent::generate();
}
}
AppServiceProvider:
$this->app->bind(
SaeidSharafi\PermissionGenerator\PermissionGenerator::class,
App\Services\PermissionGenerator::class
);
Custom Artisan Commands
use SaeidSharafi\PermissionGenerator\PermissionGenerator;
class CustomPermissionCommand extends Command {
protected $generator;
public function __construct(PermissionGenerator $generator) {
parent::__construct();
$this->generator = $generator;
}
public function handle() {
$this->generator->setCustomOption(true);
$this->generator->generate();
}
}
How can I help you explore Laravel packages today?