Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Laravel Permission Manager Laravel Package

hosseinhezami/laravel-permission-manager

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture Fit

  • RBAC Alignment: Perfectly aligns with Laravel’s ecosystem, leveraging its routing, middleware, and authentication systems. The package’s route-based permissions (e.g., users.edit) integrate seamlessly with Laravel’s route naming conventions, reducing friction in permission assignment.
  • Extensibility: Supports wildcard permissions (admin.*, *admin) and multi-guard authentication, making it adaptable to complex applications (e.g., multi-tenant SaaS). The fluent API and facade methods allow for both declarative (Blade) and programmatic (PHP) permission checks.
  • Database Schema: The included migrations (roles, permissions, role_permissions, user_roles) are standardized and follow Laravel conventions, minimizing customization needs. The pivot tables enable efficient many-to-many relationships.
  • Caching: Built-in permission caching (configurable duration) improves performance for high-traffic applications, though cache invalidation strategies should be tested in production.

Integration Feasibility

  • Laravel 10+ Compatibility: Officially supports Laravel 10+, ensuring compatibility with modern Laravel features (e.g., Eloquent 10, route caching). The auto-discovery feature simplifies installation.
  • Middleware Integration: The package provides dedicated middleware (pm, pm:role:admin, pm:permission:posts.create), which can be applied to routes without custom logic. This reduces boilerplate and centralizes permission checks.
  • Blade Directives: @hasRole and @hasPermission directives enable template-level access control, aligning with Laravel’s view layer. This is particularly useful for admin dashboards or role-specific UI elements.
  • Artisan Commands: Comprehensive CLI tools (role:create, permission:sync-routes, user:assign-role) streamline permission management during development and deployment. The permission:sync-routes command is especially valuable for keeping permissions in sync with route changes.

Technical Risk

  • Wildcard Performance: While wildcards (admin.*) offer flexibility, they may introduce performance overhead during permission checks, especially with large permission sets. Benchmarking is recommended for high-scale applications.
  • Cache Invalidation: The package caches permissions for a configurable duration (cache_duration in config). Stale cache could lead to incorrect access control if not invalidated properly (e.g., after role/permission updates). Consider implementing event-based cache invalidation (e.g., listening to RoleUpdated events).
  • Migration Safety: The package’s migrations are opinionated (e.g., table names like role_permissions). If your application already uses similar table names, conflicts may arise. Review the schema before installation.
  • Multi-Guard Support: While the package supports multiple guards, testing across guards (e.g., sanctum, session) is critical to ensure permissions propagate correctly. The PermissionTrait must be applied to all user models used with supported guards.
  • Dependency Stability: The package has 38 stars and a recent release (2025), but its low dependent count (0) suggests limited real-world adoption. Monitor GitHub issues for unresolved bugs or breaking changes.

Key Questions

  1. Scalability: How will wildcard permissions perform under heavy load (e.g., 10,000+ permissions)? Should we implement a permission hierarchy (e.g., admin > editor) to optimize checks?
  2. Audit Logging: The package lacks built-in logging for permission changes. Should we integrate with Laravel Audit or implement custom logging for compliance?
  3. Customization Needs: Does the package’s fixed schema (e.g., permissions.route column) align with our permission naming conventions? If not, will we need to extend the Permission model?
  4. Testing Strategy: How will we test permission logic across multiple guards and edge cases (e.g., role revocation mid-session)?
  5. Rollback Plan: If permissions break critical workflows, how will we quickly revert to a known state (e.g., via the role:export/role:import commands)?
  6. Documentation Gaps: The package’s documentation is comprehensive but lacks examples for complex scenarios (e.g., dynamic role assignment via API). Should we create internal runbooks?
  7. Future-Proofing: The package is MIT-licensed and actively maintained. Are there plans to fork or contribute if the package stagnates?

Integration Approach

Stack Fit

  • Laravel Ecosystem: The package is optimized for Laravel, leveraging its:
    • Routing system (permissions tied to route names).
    • Middleware (built-in pm middleware).
    • Blade templating (@hasRole, @hasPermission directives).
    • Artisan CLI (comprehensive management commands).
    • Eloquent ORM (seamless model integration via PermissionTrait).
  • Compatibility:
    • Laravel 10+: Confirmed compatibility with modern Laravel features.
    • PHP 8.1+: Required for Laravel 10+; no additional constraints.
    • Database: Supports MySQL, PostgreSQL, SQLite (via Laravel’s database layer). No vendor-specific SQL.
    • Authentication: Works with Laravel’s default guards (session, api) and third-party guards (e.g., Sanctum, Passport) if the PermissionTrait is applied to all relevant user models.
  • Tooling:
    • IDE Support: Facade methods (PermissionManager::...) and Blade directives are IDE-friendly (e.g., PHPStorm autocompletion).
    • Testing: Can be tested with Laravel’s Pest/PHPUnit via mocking the PermissionManager facade or using the PermissionTrait directly.

Migration Path

  1. Assessment Phase:
    • Audit existing permission logic (e.g., hardcoded if ($user->is_admin) checks, custom middleware).
    • Map current permissions to the package’s route-based format (e.g., users.create instead of can_edit_users).
    • Identify wildcard opportunities (e.g., admin.* for all admin routes).
  2. Pilot Implementation:
    • Install the package in a non-production environment (e.g., staging).
    • Migrate one module (e.g., admin dashboard) to use the package’s RBAC.
    • Test Blade directives, middleware, and Artisan commands for correctness.
  3. Incremental Rollout:
    • Replace custom middleware with pm middleware.
    • Update Blade templates to use @hasRole/@hasPermission.
    • Gradually migrate permission checks in controllers to use the facade or trait methods.
  4. Data Migration:
    • Export existing roles/permissions to JSON (role:export, permission:export).
    • Seed the new database tables using the package’s import commands or custom migrations.
    • For legacy data, write a script to transform old permission formats into the package’s schema.
  5. Deprecation:
    • Phase out old permission logic (e.g., custom can() methods).
    • Add deprecation warnings in logs for unused permission checks.

Compatibility

  • Existing Permissions: If your app uses custom permission tables, you’ll need to:
    • Map old permission names to the package’s route-based format.
    • Write a data migration script to populate the new tables.
  • Third-Party Packages: Check for conflicts with packages that:
    • Define their own permission tables (e.g., spatie/laravel-permission).
    • Use custom middleware for access control.
  • Caching Layers: If your app uses Redis or Memcached, ensure the package’s caching (cache_duration) doesn’t conflict with existing cache strategies.

Sequencing

  1. Pre-Installation:
    • Backup existing permission data.
    • Review the package’s configuration (config/permission-manager.php) for customization needs.
  2. Installation:
    • Run composer require hosseinhezami/laravel-permission-manager.
    • Publish config and migrations: php artisan vendor:publish --provider="HosseinHezami\PermissionManager\PermissionManagerServiceProvider" --tag="config,migrations".
    • Run migrations: php artisan migrate.
    • Apply the PermissionTrait to your User model (or all guard user models).
  3. Configuration:
    • Customize config/permission-manager.php (e.g., cache_duration, wildcards).
    • Set up middleware in app/Http/Kernel.php:
      'pm' => \HosseinHezami\PermissionManager\Middleware\PermissionMiddleware::class,
      
  4. Permission Setup:
    • Sync routes: php artisan permission:sync-routes.
    • Create initial roles/permissions via Artisan or facade:
      php artisan role:create admin "Administrator" "Full access"
      php artisan permission:create "users
      
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
besmartand-pro/php-quality-config
sentix/ai-chatbot
terminal42/code-quality-tools
codifyo/ts-generator-bundle
testo/fiber
mintobit/jobqueue
a4sex/maintenance-bundle
a4sex/entity-date-update
a4sex/client-identifier
a4sex/base-utilites
a4sex/key-value-storage
a4sex/micro-status
chilldev/dependency-injection-extra
datinglibre/datinglibre-app-api
biberltd/corebundle
bricre/symfony-bundle-test
biberltd/logbundle
dominium/http-adapter-bundle
dominium/google-analytics
a4sex/auto-clean-entity