stancl/tenancy
Automatic multi-tenancy for Laravel apps with minimal code changes. Provides tenant identification (e.g., by hostname/subdomains), isolated tenant bootstrapping, and tenancy-aware database/config switching without swapping core Laravel classes or adding model traits.
TenantMiddleware), making it easy to integrate into existing Laravel routing.tenant-assets:publish).QueueTenancyBootstrapper). Serialization of model instances may require adjustments (e.g., using IDs instead of objects).migrate-fresh --tenant)?tenant.example.com).composer require stancl/tenancy.php artisan vendor:publish --provider="Stancl\Tenancy\TenancyServiceProvider".tenancy.php (tenant model, resolvers, database connections).tenants table).php artisan tenancy:migrate to scaffold tenant databases.--force flag for production).TenantMiddleware to app/Http/Kernel.php (typically in $middlewareGroups['web']).HostnameTenantResolver).Tenant::resolve() and Tenant::impersonate().php artisan tenancy:setup for initial tenant database creation.Tenant::resolve()).users) require careful design (e.g., tenant_id foreign keys).posts) are auto-scoped to the tenant’s database.migrate-fresh --tenant for new tenant onboarding.tenancy:migrate or custom commands.tenancy:drop or cascade drops in migrations.mysqldump --databases tenant_db).php artisan migrate for central schema changes.migrate-fresh --tenant for tenant-specific migrations..env overrides) can be managed via tenant:config or filesystem paths.tenant_id in log channels).Tenant::resolve() logs.QueueTenancyBootstrapper context.Tenant::impersonate() for admin debugging across tenants.DB::disconnect() in middleware).Tenant::resolve()).max_connections in MySQL).| Failure Scenario | Impact | Mitigation |
|---|---|---|
| Tenant resolution failure | 500 errors or incorrect tenant data | Fallback to central app or default tenant; log resolution errors. |
| Database connection exhaustion | Tenant app crashes | Implement connection pooling; monitor and scale database resources. |
| Queue job context loss | Jobs fail silently | Use QueueTenancyBootstrapper; log job dispatch context. |
| Cache stampede |
How can I help you explore Laravel packages today?