Spatie Multitenancy Package for Laravel

Published on by

Spatie  Multitenancy Package for Laravel image

Multitenancy is a hot topic for web developers that need to support multiple clients with the same codebase, but need to keep data separate either via table prefixes or separate databases.

In the Laravel space, Spatie released a new offering recently with an unopinionated multitenancy package to make apps tenant-aware:

Our newest package, laravel-multitenancy, has been released!https://t.co/q9HzfkNw7w
The philosophy of this package is that it should only provide the bare essentials to enable multitenancy

Docs: https://t.co/zspuLyt3KN

Video (demo+source dive): https://t.co/i3QzTezcuY pic.twitter.com/cy2Fk4tIe6

— Freek Van der Herten (@freekmurze) May 20, 2020

According to Freek Van der Herten’s introductory post, the “philosophy of the package is that it should only provide the bare essentials to enable multitenancy.”

This package takes care of a few things related to tenancy for you:

  1. Tracking which tenant is the current tenant.
  2. Dynamically change the configuration when changing a tenant.
  3. Tools to help with creating a new tenant database and running migrations on multiple tenants.

We’ll only touch lightly on the package; the best place to get started is reading the laravel-multitenancy documenation.

Tenant Model

At the core of the package is the Tenant model, which represents each available tenant. You can work with and access the current tenant with a few handy methods provided by the package:

use Spatie\Multitenancy\Models\Tenant;
 
// Get the current tenant, or null if there is no current tenant
Tenant::current()
 
// Get the same thing via the container
app('currentTenant');
 
// Determine if there is a current tenant
Tenant::checkCurrent()
 
// Setting a tenant instance as the current tenant
$tenant->makeCurrent();
 
// Forget the current tenant
Tenant::forgetCurrent();

Finding Tenants

After installing the Spatie multitenancy package, you have a tenants database table that will include a row for each tenant in the application. Part of the job of Spatie’s package is determining which tenant should be used to serve the current request, typically based on a domain name. Out of the box, the package provides a DomainTenantFinder class to look up a tenant and set it as the current. However, you can configure a custom finder as long as it extends the abstract TenantFinder class.

Other considerations you need when finding a current tenant include the NeedsTenant middleware for setting the current tenant based on the incoming request and the global EnsureValidTenantSession middleware to prevent users from a given tenant to access other tenants.

Tenant-Aware Console and Queues

Another challenge when implementing multi-tenancy is scoping console commands and queue jobs. By default, all queue jobs are tenant-aware, and you can disable that capability via configuration. Spatie’s package provides a TenantAware and NotTenantAware to make specific queue jobs aware of which tenant to run for any custom needs.

Another thing you’ll likely need is the ability to run a console command for each tenant or target a specific tenant. This package has you covered with the tenants:artisan command:

# Run migrate on each tenant
php artisan tenants:artisan migrate
 
# Run migrate on a specific tenant with args
php artisan tenants:artisan "migrate --seed" --tenant=123

Learn More

You can learn more about this package, get full installation instructions, and view the source code on GitHub at spatie/laravel-multitenancy.

I’d also recommend reading Freek’s post which goes into more in-depth details and reasons for making this package.

Paul Redmond photo

Staff writer at Laravel News. Full stack web developer and author.

Filed in:
Cube

Laravel Newsletter

Join 40k+ other developers and never miss out on new tips, tutorials, and more.

image
Paragraph

Manage your Laravel app as if it was a CMS – edit any text on any page or in any email without touching Blade or language files.

Visit Paragraph
Laravel Forge logo

Laravel Forge

Easily create and manage your servers and deploy your Laravel applications in seconds.

Laravel Forge
Tinkerwell logo

Tinkerwell

The must-have code runner for Laravel developers. Tinker with AI, autocompletion and instant feedback on local and production environments.

Tinkerwell
No Compromises logo

No Compromises

Joel and Aaron, the two seasoned devs from the No Compromises podcast, are now available to hire for your Laravel project. ⬧ Flat rate of $7500/mo. ⬧ No lengthy sales process. ⬧ No contracts. ⬧ 100% money back guarantee.

No Compromises
Kirschbaum logo

Kirschbaum

Providing innovation and stability to ensure your web application succeeds.

Kirschbaum
Shift logo

Shift

Running an old Laravel version? Instant, automated Laravel upgrades and code modernization to keep your applications fresh.

Shift
Bacancy logo

Bacancy

Supercharge your project with a seasoned Laravel developer with 4-6 years of experience for just $2500/month. Get 160 hours of dedicated expertise & a risk-free 15-day trial. Schedule a call now!

Bacancy
Lucky Media logo

Lucky Media

Bespoke software solutions built for your business. We ♥ Laravel

Lucky Media
Lunar: Laravel E-Commerce logo

Lunar: Laravel E-Commerce

E-Commerce for Laravel. An open-source package that brings the power of modern headless e-commerce functionality to Laravel.

Lunar: Laravel E-Commerce
LaraJobs logo

LaraJobs

The official Laravel job board

LaraJobs
Larafast: Laravel SaaS Starter Kit logo

Larafast: Laravel SaaS Starter Kit

Larafast is a Laravel SaaS Starter Kit with ready-to-go features for Payments, Auth, Admin, Blog, SEO, and beautiful themes. Available with VILT and TALL stacks.

Larafast: Laravel SaaS Starter Kit
SaaSykit: Laravel SaaS Starter Kit logo

SaaSykit: Laravel SaaS Starter Kit

SaaSykit is a Laravel SaaS Starter Kit that comes with all features required to run a modern SaaS. Payments, Beautiful Checkout, Admin Panel, User dashboard, Auth, Ready Components, Stats, Blog, Docs and more.

SaaSykit: Laravel SaaS Starter Kit
Rector logo

Rector

Your partner for seamless Laravel upgrades, cutting costs, and accelerating innovation for successful companies

Rector

The latest

View all →
Microsoft Clarity Integration for Laravel image

Microsoft Clarity Integration for Laravel

Read article
Apply Dynamic Filters to Eloquent Models with the Filterable Package image

Apply Dynamic Filters to Eloquent Models with the Filterable Package

Read article
Property Hooks Get Closer to Becoming a Reality in PHP 8.4 image

Property Hooks Get Closer to Becoming a Reality in PHP 8.4

Read article
Asserting Exceptions in Laravel Tests image

Asserting Exceptions in Laravel Tests

Read article
Reversible Form Prompts and a New Exceptions Facade in Laravel 11.4 image

Reversible Form Prompts and a New Exceptions Facade in Laravel 11.4

Read article
Basset is an alternative way to load CSS & JS assets image

Basset is an alternative way to load CSS & JS assets

Read article