mapeveri/multi-tenancy-bundle
A multi-tenancy bundle for PHP applications that simplifies tenant isolation, tenant-aware database connections, and request-based tenant resolution. It provides the building blocks to run multiple tenants from a single codebase with minimal configuration.
Architecture fit
The first thing to flag in any cross-functional review is a naming mismatch: despite being evaluated under a "Laravel/PHP package" lens, mapeveri/multi-tenancy-bundle is a Symfony bundle, not a Laravel package. There is no service provider, no facade, no config/multitenancy.php, and no package auto-discovery. For a Laravel codebase the fit is zero without a port, and the port is a rewrite, not an adaptation.
The underlying model — a config-driven tenant resolver that binds tenant context into the container during the request lifecycle — is sound and matches what every production tenancy library eventually does. But the value here is conceptual, not functional: the package demonstrates the shape of tenant resolution, not a runtime you can depend on. Multi-tenancy is a security boundary (one tenant reading another's data), so the architecture fit matters much more than for a typical utility. A pre-modern implementation of a security boundary is a liability, not an enabler.
Integration feasibility
Low, and effectively blocked three ways:
WARNING: this repo is not maintained anymore. Combined with 11 stars and 0 dependents, there is no community to lean on: no reference implementations, no fork ecosystem, no third-party security review.Technical risk
High and asymmetric. The downside of a tenancy defect is cross-tenant data exposure, which is a reportable incident in most regulated environments. Adoption would put unmaintained code directly on the customer-data boundary with:
Key questions (to resolve before any spike spend)
Stack fit
The realistic TPM framing is build-vs-adopt vs. reference, not "how do we install this":
composer require.stancl/tenancy or spatie/laravel-multitenancy (for Laravel) or a maintained Symfony bundle against the isolation model.Migration path (only if we insist on using it)
Fork → rename to internal namespace → pin Composer constraints → replace Symfony bundle registration with a Laravel service provider (or a Symfony DI extension if staying on Symfony) → port deprecated APIs → wrap every query path in an isolation test harness → security review → feature-flagged staged rollout. Budget 3–6 weeks engineering, and treat it as a rewrite with the original as a design document, not a dependency upgrade.
Compatibility
Expect hard blocks from PHP-version syntax and pre-modern Symfony/Laravel contracts. The most common realistic outcome is a Composer conflict that prevents installation outright, or an install that pins the framework to a version that blocks unrelated security patches. Confirm the version matrix from composer.json before allocating sprint capacity.
Sequencing
Maintenance
We inherit 100% of the burden. No upstream commits, no dependency updates, no advisories. Every Laravel/Symfony major version is manual porting work against code we now own. This is the single largest ongoing cost and the one TPMs most often underestimate.
Support
No maintainer triage, no issue response, no community forum presence. Designate at least two engineers as owners who understand the isolation model well enough to be on-call for it. Codify an SLA for isolation defects — these are SEV-1 by nature, and "upstream will fix it" is not an option.
Scaling
Unknown and untested. Connection-per-tenant switching has real implications for connection pools and per-tenant latency as tenant count reaches the hundreds/thousands. Background workers are the classic failure point: if tenant context isn't rebound per job, jobs silently run against the wrong tenant. Neither property is validated by an 11-star project.
Failure modes to put on the risk register
Ramp-up
Documentation is minimal or stale; no example applications exist. New engineers must read source to understand behavior. Combine that with the security sensitivity of the domain and onboarding cost is measured in weeks, not days. Factor this into the resourcing plan alongside the rewrite.
Bottom line for the product decision: the package's score (0.305), zero dependents, and explicit unmaintained status are consistent with what any code inspection will show. Close the evaluation at the spike stage. Redirect engineering toward a maintained tenancy library or a small internal implementation with a named owner. Fund the tenancy decision properly — it is architectural and hard to reverse — rather than reaching for the cheapest available package on the customer-data boundary.
How can I help you explore Laravel packages today?