Porter is a lightweight, blazing-fast Laravel role-based access control package created by Hassan Ibrahim, which treats roles as domain business logic rather than database abstractions. Hassan built this for developers who value simplicity, performance, and a clean architecture.
Porter's core concept emphasises that any model can be considered Assignable or Roleable, and the Roster then defines the access control relationship between them.
Features
- Assignment-Focused Design: Treats roles as business assignments with contextual logic
- Individual Role Classes: Each role is its own focused class extending the
BaseRole - Ultra-Minimal Architecture: Just three core components for assignment management
- Blazing Performance: Optimised for speed with minimal database interaction and built-in caching
- Enhanced Security: Assignment keys encrypted with Laravel's built-in encryption
- Automatic RoleCast: Seamless conversion between database keys and type-safe RoleContract instances
- Perfect Laravel Integration: Custom Blade directives, middleware, plus seamless Gates and Policies
Basic Example
use Hdaklue\Porter\Facades\Porter; // Assign a rolePorter::assign($user, $project, 'admin'); // Check the user's role$isAdmin = $user->hasRoleOn($project, 'admin'); // Remove a rolePorter::remove($user, $project); // Change the rolePorter::changeRoleOn($user, $project, 'editor');
Porter also provides an interactive Artisan command that allows you to create role classes.
php artisan porter:create
An example role class might look like:
use App\Porter\BaseRole; // Your application's base role final class AssistantRegionalManager extends BaseRole{ public function getName(): string { return 'assistant_regional_manager'; } public function getLevel(): int { return 8; } public function getDescription(): string { return "The beet-loving, karate-chopping, all-around office superhero we didn't know we needed"; }}
You can also integrate this with your Laravel models with the CanBeAssignedToEntity and ReceivesRoleAssignments traits:
use Hdaklue\Porter\Concerns\{CanBeAssignedToEntity, ReceivesRoleAssignments}; class User extends Authenticatable{ use CanBeAssignedToEntity; // Your existing User model code...} class Project extends Model{ use ReceivesRoleAssignments; // Your existing Project model code...}
As of this writing, Porter is still relatively new, and Hassan is keen to get input and some additional help from the community with some other potential features.
To learn more about this package, contribute to it, and view the source code. You can find the repository on GitHub.