Multi-tenancy in Laravel: zo bouw je een schaalbaar SaaS-platform.
Multi-tenancy stelt één Laravel-applicatie in staat om meerdere opdrachtgevers te bedienen terwijl hun data strikt gescheiden blijft. Het is de technische basis voor schaalbare SaaS-platformen. In dit artikel leggen we de twee hoofdstrategieën uit, vergelijken we relevante packages en helpen je de juiste architectuurkeuze maken.
Wat is multi-tenancy?
Stel dat je een softwareplatform bouwt voor HR-teams. Je eerste opdrachtgever is een productiebedrijf met tweehonderd medewerkers. De tweede is een advocatenkantoor. De derde een logistieke dienstverlener. Drie verschillende organisaties, elk met hun eigen gebruikers, hun eigen data en hun eigen processen. Je hebt twee opties: voor elke opdrachtgever een aparte installatie draaien, of één applicatie bouwen die alle drie bedient terwijl hun data strikt gescheiden blijft. Dat tweede is multi-tenancy.
Één applicatie, meerdere opdrachtgevers: hoe werkt dat?
In een multi-tenant systeem is elke opdrachtgever een "tenant". De applicatie herkent bij elk binnenkomend request welke tenant er achter zit, doorgaans via een subdomein (productiebedrijf.jouwplatform.nl), een URL-segment of een JWT-token, en serveert alleen de data van die tenant.
De uitdaging zit hem in de scheiding. Een bug in je tenant-identificatie die ervoor zorgt dat tenant A de data van tenant B kan zien, is niet alleen een technisch probleem. Het is een privacyincident.
Multi-tenancy vs. meerdere installaties: het verschil.
Meerdere installaties zijn eenvoudiger te bouwen en volledig geïsoleerd. Maar ze schalen slecht. Elke nieuwe opdrachtgever betekent een nieuwe server, een nieuwe database, nieuwe deployments en dubbel onderhoud. Bij tien opdrachtgevers is dat al omslachtig. Bij honderd is het onhoudbaar. Multi-tenancy lost dit op door infrastructuur te delen zonder data te vermengen.
De twee hoofdstrategieën in Laravel.
Database-per-tenant: maximale isolatie.
Elke tenant krijgt zijn eigen database. De applicatie verbindt bij elk request dynamisch met de juiste database op basis van de tenant-identificatie.
Voordelen: maximale data-isolatie, eenvoudige compliance (data van elke tenant staat fysiek apart), eenvoudig te back-uppen per tenant en te exporteren bij opzegging.
Nadelen: hogere infrastructuurkosten bij veel tenants, complexere migraties (elke database moet bijgewerkt worden) en hogere beheerslast.
Shared database met tenant_id: kostenefficiënt en flexibel.
Alle tenants delen één database. Elke tabel bevat een tenant_id-kolom. De applicatie filtert automatisch alle queries op de actieve tenant.
Voordelen: lagere infrastructuurkosten, eenvoudigere migraties (één keer uitvoeren), beter voor platformen met veel kleine tenants.
Nadelen: hogere kans op data-lekken als de tenant-filter niet consequent wordt toegepast, complexere compliance bij strikte datalocatievereisten en potentiële performance-problemen als de database groot wordt.
Hybride aanpak: wanneer dat verstandig is.
Sommige platformen combineren de twee strategieën: gedeelde database voor niet-gevoelige gegevens (configuratie, logging) en aparte databases voor gevoelige data (persoonsgegevens, financiële records). Dat vraagt meer architectuurwerk maar biedt de voordelen van beide werelden.
Multi-tenancy implementeren in Laravel: packages.
Tenancy for Laravel: flexibel en feature-rijk.
Tenancy for Laravel van Arkadiusz Kondas is de meest volwassen open-source oplossing. Het ondersteunt zowel database-per-tenant als shared-database aanpakken, biedt automatische tenant-identificatie via subdomeinen of domeinen en heeft uitgebreide documentatie.
De package gebruikt het concept van "bootstrappers" om de applicatie per request opnieuw te configureren voor de actieve tenant. Cache, queue, storage, database: alles wordt automatisch geswitcht.
Laravel Jetstream en Spark: teams en billing.
Laravel Jetstream biedt een ingebouwde "teams"-structuur die als lightweight multi-tenancy werkt. Dat werkt goed voor platformen waarbij gebruikers tot meerdere teams kunnen behoren en data op team-niveau wordt gescheiden.
Laravel Spark voegt billing toe: abonnementenbeheer via Stripe, direct gekoppeld aan je tenant-structuur. Voor SaaS-platformen waarbij tenants een abonnement afsluiten, is dit een serieuze versneller.
Zelf bouwen vs. package gebruiken
Voor eenvoudige use cases met een shared database en beperkt aantal tenants is een eigen implementatie met global scopes haalbaar. De valkuil: je bouwt langzaam opnieuw wat de packages al goed doen, maar zonder de battle-tested edge cases. Bij complexere vereisten is een package vrijwel altijd de betere keuze.
Valkuilen bij multi-tenancy en hoe je ze vermijdt.
Datalek tussen tenants voorkomen.
Dit is de grootste risico. Een query die per ongeluk geen tenant-filter toepast, retourneert data van alle tenants. In Laravel voorkom je dit door een global scope te gebruiken die automatisch op elk model wordt toegepast, én door dit te testen met integration tests die expliciet controleren dat tenant A geen data van tenant B ziet.
Performance bij shared database.
Als de database groeit, kunnen queries traag worden. Zorg dat elke tabel die tenant-data bevat een index heeft op tenant_id. Overweeg database sharding als het volume extreem groeit. Monitor query-tijden per tenant om prestatieproblemen vroeg te signaleren.
Migraties beheren per tenant.
Bij database-per-tenant moet elke migratie op alle tenant-databases worden uitgevoerd. Tenancy for Laravel heeft hier ingebouwde ondersteuning voor. Bij een zelfgebouwde oplossing is dit een veelgemaakte fout: migraties worden uitgevoerd op de primaire database maar vergeten voor bestaande tenants.
Dit sluit mooi aan...
Laravel 13: wat de nieuwste versie betekent voor jouw project.
Laravel 13 introduceert Native PHP Attributes, een AI SDK en PHP 8.3-vereiste. Lees wat er verandert en wanneer upgraden slim is.
Het verschil tussen AI, machine learning en deep learning.
Ontdek hoe AI, machine learning en deep learning zich tot elkaar verhouden en wanneer elke technologie de beste keuze is voor een specifieke toepassing.
Wat is het verschil tussen front-end en back-end?
Ontdek in heldere taal wat de front-end en back-end van software doen, hoe ze samenwerken en wat jouw project nodig heeft.
Veelgestelde vragen over multi-tenancy in Laravel.
Multi-tenancy is een architectuurpatroon waarbij één applicatie meerdere opdrachtgevers (tenants) bedient terwijl hun data strikt gescheiden blijft. Het is de standaard aanpak voor schaalbare SaaS-platformen.
Bij database-per-tenant krijgt elke opdrachtgever een eigen database, wat maximale isolatie biedt maar hogere infrastructuurkosten meebrengt. Bij een shared database delen alle tenants één database, gescheiden via een tenant_id-kolom. Dat is goedkoper maar vraagt zorgvuldigere implementatie om datalekken te voorkomen.
Tenancy for Laravel is de meest volwassen en uitgebreide oplossing en ondersteunt beide strategieën. Voor platformen met billing is Laravel Spark een goede aanvulling. De beste keuze hangt af van de complexiteit van je use case.
De initiële investering is hoger dan een single-tenant applicatie. Maar op schaal verdient het zich terug: je beheert één codebase, één deployment-pipeline en één set infrastructuur voor honderden of duizenden opdrachtgevers.
Veilig genoeg als het goed geïmplementeerd is. De kritische factor is het consequent toepassen van tenant-filters op alle queries, getest met expliciete boundary-tests. Platforms met strikte datalocatievereisten, zoals in de zorg of overheid, kiezen doorgaans voor database-per-tenant.
Weten welke multi-tenancy architectuur past bij jouw SaaS-initiatief?