grazulex / laravel-multipersona
Laravel MultiPersona is a lightweight context-layer system for Laravel users. It allows a single user to switch between different roles, accounts, or tenants dynamically, without creating multiple logins or sessions.
Requires
- php: ^8.3
- illuminate/support: ^12.0|^13.0
- nesbot/carbon: ^3.10
Requires (Dev)
- doctrine/dbal: ^4.2
- larastan/larastan: ^3.4
- laravel/pint: ^1.22
- orchestra/testbench: ^10.0|^11.0
- pestphp/pest: ^3.8|^4.0
- pestphp/pest-plugin-laravel: ^3.2|^4.0
- rector/rector: ^2.0
Suggests
- doctrine/dbal: Required for database operations and migrations
Provides
None
Conflicts
None
Replaces
None
This package is auto-updated.
Last update: 2026-09-18 16:20:01 UTC
README
Tip
What Laravel MultiPersona does for you โ Let one user act as several personas โ admin and client, company A and company B โ and switch between them without extra logins or sessions. Backend-only, it works with your existing policies and middleware.
This package is free and maintained on my own time. If it saves you hours, a small contribution helps me keep it going: ๐ GitHub Sponsors ยท โ Buy Me a Coffee ยท PayPal
Laravel MultiPersona is a lightweight context-layer system for Laravel users.
Laravel MultiPersona is a lightweight context-layer system for Laravel users.
It allows a single user to switch between different roles, accounts, or tenants dynamically, without creating multiple logins or sessions.
๐ What It Solves
- Switch between "personas" (admin โ client, company A โ company B)
- Contextual permissions and role handling
- No UI or API enforced โ 100% backend, policy, and middleware-driven
๐ฆ Installation
Requirements
- PHP 8.3 or higher
- Laravel 12.x or 13.x
composer require grazulex/laravel-multipersona
๐งฉ Core Concepts
- Persona: A context attached to a user (e.g. company, role, project)
- Active Persona: The currently selected context
- Persona Manager: A service to query, switch, or manipulate personas
- Middleware: Force or apply a persona context
โ Quick Example
// Get current active persona $currentPersona = persona(); // List all user personas $userPersonas = auth()->user()->personas; // Create a new persona $persona = auth()->user()->createPersona([ 'name' => 'Company Admin', 'context' => [ 'role' => 'admin', 'company_id' => 123, 'permissions' => ['read', 'write', 'delete'] ] ]); // Switch to persona auth()->user()->switchToPersona($persona);
๐งฑ What's Provided
- Trait:
HasPersonasfor yourUsermodel - Middleware:
EnsureActivePersona,SetPersonaFromRequest - Helpers:
persona(),personas($user) - Events: Complete event system for persona lifecycle
- Service:
PersonaManagerfor programmatic access - Contract:
PersonaInterfacefor custom implementations
โ What's Not Included
- No routes or controllers
- No CLI or HTTP APIs
- No UI layer โ you choose how to expose it
๐ Complete Documentation
Getting Started
- ๐ Installation Guide - Complete setup instructions
- ๐ Usage Guide - Basic and advanced usage examples
- โก Quick Start Example - Working code examples
Core Features
- ๐ญ Events Guide - Event system and listeners
- ๐ก๏ธ Middleware Guide - Route protection and context
- ๐๏ธ Architecture - System design and components
Advanced Topics
- ๐ฏ Advanced Patterns - Multi-tenant, role hierarchy, delegation
- ๐ Frontend Integration - Vue.js, React, Alpine.js examples
- ๐ API Reference - Complete method documentation
Use Cases
- Multi-tenant SaaS: Users switch between different company contexts
- Role-based Access: Same user, different permissions per context
- Agency Management: Manage multiple client accounts
- Marketplace Platforms: Buyer/seller context switching
- Enterprise Systems: Department or project-based access
๐ฏ Real-World Examples
Multi-tenant Application
// User switches between companies $companyA = $user->createPersona([ 'name' => 'Acme Corp Admin', 'context' => [ 'company_id' => 1, 'role' => 'admin', 'permissions' => ['manage_users', 'view_reports'] ] ]); $companyB = $user->createPersona([ 'name' => 'TechStart User', 'context' => [ 'company_id' => 2, 'role' => 'user', 'permissions' => ['view_dashboard'] ] ]);
Middleware Protection
// Protect routes requiring specific roles Route::middleware(['auth', 'persona.required', 'role:admin'])->group(function () { Route::get('/admin/dashboard', [AdminController::class, 'dashboard']); });
Frontend Integration
<!-- Vue.js component --> <PersonaSelector :current-persona="currentPersona" :available-personas="availablePersonas" @persona-changed="handlePersonaChange" />
๐งช Testing
The package includes comprehensive test coverage:
composer test
Current test metrics:
- 58 tests across Unit, Feature, Integration, and Listeners
- 87% code coverage
- 149 assertions ensuring reliability
๐ค Contributing
We welcome contributions! See our Contributing Guide for details.
Development Setup
git clone https://github.com/grazulex/laravel-multipersona.git cd laravel-multipersona composer install composer test
๐ Security
If you discover any security vulnerabilities, please review our Security Policy.
๐ Support This Package
Laravel MultiPersona is free, open source and maintained on my own time. If it saves you hours, here is how you can give back:
- โญ Star the repository โ it helps other developers find it
- ๐ฆ Share it with your team and network
- ๐ Sponsor on GitHub, buy me a coffee or donate via PayPal โ every contribution funds maintenance, new features and Laravel upgrades
๐ License
Laravel MultiPersona is open-sourced software licensed under the MIT license.
Made with โค๏ธ for the Laravel community
๐ Documentation โข ๐ Report Issues โข ๐ฌ Discussions
