Weave 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

Multi Tenant Bundle Laravel Package

zhortein/multi-tenant-bundle

A multi-tenant bundle for PHP applications that helps isolate tenants, resolve them per request, and manage tenant-aware configuration and database connections. Useful for building SaaS platforms with clean tenant separation and less boilerplate.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

What v1.0.0-rc.12 delivers. The release extends the existing facade with an optional TenantObjectStorageAuditInterface providing lazy, paginated tenant location inventory, explicit historical scopes, and structured per-object observations. It also adds a versioned LogicalObjectIdentity and explicit content-plus-identity writes. Audit remains disabled by default, so the default blast radius for an existing integration is near-zero.

Architecture fit. The package is a multi-tenancy bundle whose validation matrix targets PHP/Symfony versions plus PostgreSQL 16/18, Flysystem/S3, Messenger and Scheduler. That is a Symfony-shaped surface, not a native Laravel one. The "facade" language is ambiguous — confirm whether a Laravel service provider, container bindings, config publishing and tenant-resolution hooks actually exist, or whether a Laravel app would be consuming Symfony-flavoured contracts through adapters. This is the single largest architecture-fit unknown and should be resolved before any design work.

Integration feasibility. Favourable, if the above checks out: the audit surface is additive, opt-in, and reads through the storage abstraction the app likely already has. There are no automatic SQL, object, or metadata migrations, which removes the usual upgrade hazard. The main integration work is on the consumer side — deciding who reads the paginated inventory, how identity_absent is surfaced in reports, and what "historical scope" means for your bucket layout.

Technical risk.

  • Prerelease status. v1.0.0-rc.12 is not GA. Public API can still change; treat any contract as provisional.
  • Semantics of the identity claim. The authenticated claim supports application correlation only. It does not attest content and does not prevent replay by a storage administrator. Any downstream expectation of tamper-evidence or non-repudiation would be a misreading — this must be communicated explicitly to security/compliance stakeholders before the audit output is used in any assurance context.
  • Governance and supply chain. Release review is author self-review without independent human approval, and distribution is GitHub's generated source archives with no attached asset, signature, or SBOM. For a component that observes tenant boundaries, this is a meaningful maturity gap. Pin by SHA and vendor the archive.
  • Test-signal caveats. 22-job compatibility and 16-job object-storage gates, real MinIO at low/high HTTPS, and five archive consumer profiles with 518 files compared are genuinely strong. However, "existing full-suite placeholder skips and PHPUnit mock notices remain disclosed" means parts of the non-critical suite are not asserting. Critical object-storage/MinIO and consumer recipes reject skips, which mitigates but does not eliminate.
  • Write-shape compatibility. The notes guarantee RC12 can read RC11 objects. They do not state that RC11 can read RC12 content-plus-identity writes. Verify before relying on code rollback as a rollback strategy.
  • Fail-closed pagination. Invalid pagination or tenant scope fails the whole page. Correct for integrity, but it makes a single bad scope a page-level outage for the consumer — a resilience concern, not just a correctness one.

Key questions to put to the maintainer.

  1. Is there a first-class Laravel integration path (service provider, config, tenant resolution), or is Laravel support incidental?
  2. Are RC12 identity-bearing writes readable by RC11 code, and what happens to identity metadata if the package is removed?
  3. What are the cursor/consistency guarantees for lazy pagination against a bucket mutating concurrently?
  4. What exactly is captured in "structured per-object observations" — could it include tenant-identifying or sensitive metadata that lands in logs or exports?
  5. What is the GA timeline and versioning commitment, and will there be independent review before 1.0.0?
  6. Who maintains this, and what is the support model for a production consumer?
  7. Which database and storage backends are actually supported beyond the tested PostgreSQL/MinIO matrix (MySQL, AWS S3 native, Azure/GCS)?

Integration Approach

Stack fit. Best fit is a Laravel application that already isolates tenant data and writes tenant-scoped objects to an S3-compatible store via Flysystem. If the app uses a single shared bucket with tenant path prefixes, the "tenant location inventory" concept maps cleanly; if it uses per-tenant buckets or per-tenant credentials, confirm the audit can traverse them with the credential model you have. Applications without object storage gains nothing from RC12 and should not take the dependency for this feature alone.

Migration path. Two tiers:

  • Do nothing tier: existing RC11 consumers get RC12 compatibility with no migration, no schema change, no data movement. Upgrade is a version pin.
  • Adopt-audit tier: enable the audit capability behind your existing config flag (it ships disabled), wire a consumer for the paginated inventory, and treat historical objects as identity_absent by design. Do not plan a backfill of identity for pre-existing objects — the package explicitly refuses to invent provenance, and fabricating it in your own layer would defeat the purpose.

Compatibility checks before merging. Confirm PHP version against your runtime, confirm PostgreSQL 16/18 (or your actual engine) is in the supported set, confirm Flysystem/S3 adapter versions align, and confirm Messenger/Scheduler usage doesn't collide with your Laravel queue and scheduler setup — Symfony Messenger semantics do not map one-to-one onto Laravel queues, and that is where surprises usually appear.

Sequencing.

  1. Pin the exact SHA; vendor the source archive; record it in your dependency inventory.
  2. Spike in a non-production environment against a real MinIO or S3 bucket containing representative tenant data, including at least one deliberately malformed scope to observe the fail-closed behaviour.
  3. Build the read consumer (reporting/export) against TenantObjectStorageAuditInterface behind a disabled flag.
  4. Enable for a single low-risk tenant in staging; measure page counts, latency, and list-operation cost.
  5. Roll out per-tenant via flag; keep the RC11 code path deployable.
  6. Write the rollback runbook: disable flag → revert pin → verify RC11 can read any RC12-written objects (see key question 2).

Rollback. Cheap at the feature level (flag off, no migrations to unwind) but not automatically cheap at the data level, since identity write shape is the open question. Nail that down before enabling in production.

Operational Impact

Maintenance. Budget for prerelease churn. Expect interface adjustments between RC and GA, and read every RC12→RC13+ release note rather than assuming semver stability. The project presents as small-team or single-maintainer with self-review; plan for the possibility that you become the de facto maintainer of your fork. Decide now whether you have the PHP depth to patch the audit layer in-house.

Support. The release is explicit that no downstream application integration, deployment, repair, or orphan deletion is included. The audit observes; it does not remediate. If a stakeholder reads "audit" and hears "compliance remediation workflow," correct that immediately. Your team owns runbooks for what to do when identity_absent spikes or when a page fails on tenant scope.

Scaling. Lazy pagination is the right shape, but cost and latency scale with object count, not tenant count. A large shared bucket means many ListObjects round trips per tenant inventory, with real per-request billing and throttling exposure on AWS S3. Historical scopes amplify this. Model the page count and list-call volume for your largest tenant before enabling broadly, and cache or snapshot inventory results rather than recomputing per dashboard load.

Failure modes to instrument.

  • identity_absent rate per tenant — the primary signal that new writes are bypassing the identity path.
  • Page-level failures on invalid pagination or scope — one bad tenant scope degrades the whole consumer; isolate per-tenant calls and alert on it.
  • Anomaly sanitization volume — sanitized entry anomalies are a safety feature but also a blind spot; count them.
  • Replay by a storage administrator — explicitly out of scope, never reportable as "clean" by this tool alone; document the residual risk.
  • Cross-backend drift — validation covered MinIO, not native AWS S3; behaviour differences in listing consistency and pagination are plausible.
  • Credential scope — the audit identity needs broad list/read permissions across tenant locations; that is a privilege-concentration risk worth a security review.

Ramp-up. Low for a mid-level Laravel developer: the integration is facade calls plus a flag. Call it one to two days to a working spike and one to two weeks to a production-grade consumer with instrumentation, cost modelling, and rollback validation. Add separate time for a security/compliance conversation about what the audit does and does not prove — that conversation, not the code, is the long pole.

Recommendation. Adopt for evaluation behind a disabled flag; do not route compliance or assurance-critical reporting through this capability until GA, independent review, and a Laravel-native integration path are confirmed. Pin by SHA, vendor the archive, and keep a fork-ready posture.

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.
se7enxweb/flysystem
lampwick/laravel
jeslage/statamic-emojis
micahdshackelford/rmap-laravel
draftsmaninc/draftsman
square-bit/laravel-volition
himito/laravel-mailman
htinlynn/genius-helper
maco-studios/hephaestus
elmogy/larafast
xeviant/laravel-paystack
gorilladash/laravel-website-sdk
martialbe/flysystem-oss
chondal/3312client
jeroen-g/flickr
opscale-co/nova-genbi
itsjustvita/laravel-retention
tequilarapido/trackit
gregsphotography/site-builder-filament
cabaoctavio/laravel-query-log