Skip to content

henryavila/laravel-nova-multitenancy

Repository files navigation

Integrate the multitenancy single database in Laravel Nova.

Latest Version on Packagist GitHub Tests Action Status GitHub Code Style Action Status Total Downloads

Integrate the multitenancy single database in Laravel Nova.

This package is based on https://spatie.be/docs/laravel-multitenancy. So logic and config of spatie/laravel-multitenancy still aplies

Installation

You can install the package via composer:

composer require henryavila/laravel-nova-multitenancy

You can publish the config, view, migrations and translation with:

php artisan vendor:publish --provider="HenryAvila\LaravelNovaMultitenancy\LaravelNovaMultitenancyServiceProvider" 

The views file will be published, personalize it at your will. Don't forget to run npm run build

You can run the migration with (To create the Tenant table)

php artisan migrate

Edit the app\Http\Kernel.php file adding an entry in web group and creating the tenant group

protected $middlewareGroups = [
    // ...
    
    'web' => [
        // ...
        \HenryAvila\LaravelNovaMultitenancy\Http\Middleware\SetTenantMiddleware::class,
    ],
    
    // ...
    
    'tenant' => [
        \HenryAvila\LaravelNovaMultitenancy\Http\Middleware\NeedsTenant::class,
        \HenryAvila\LaravelNovaMultitenancy\Http\Middleware\EnsureValidTenantSession::class,
    ]
];

If you activated (User Impersonation)[https://nova.laravel.com/docs/4.0/customization/impersonation.html] on Laravel Nova, you must set up this event Listeners.

Edit the file App\Providers\EventServiceProvider and add:

 protected $listen = [
        \Laravel\Nova\Events\StartedImpersonating::class  => [
            \HenryAvila\LaravelNovaMultitenancy\Listeners\ClearTenantSessionListener::class,
        ],
        \Laravel\Nova\Events\StoppedImpersonating::class => [
            \HenryAvila\LaravelNovaMultitenancy\Listeners\ClearTenantSessionListener::class,
        ],
];

Make your User model extends \HenryAvila\LaravelNovaMultitenancy\Models\User

If you want to customize the Tenant model, change it in config file

Add the trait \HenryAvila\LaravelNovaMultitenancy\Traits\ModelWithTenant to all models that are tenant aware

Add to your database file a tenant_connection entry with the tenant db connection. See:

return [
    // database.php
    'tenant_connection' => env('DB_TENANT_CONNECTION', 'tenant'),

This is the relation between the connections and the database

Name Database
default Landlord database
tenant_connection Tenant database

PS.: Don't forget to create this connections in database.connections config file.

Usage

To protect a specific route, just add the 'tenant' middleware to route

// in a routes file

Route::middleware('tenant')->group(function() {
    // routes
});

If you receive an error: Route [login] not defined.. Remember to change the route from login to nova.login in your App\Http\Middleware\Authenticate file

protected function redirectTo($request)
{
    return $request->expectsJson() ? null : route('nova.login');
}

Another option to don't define the tenant to an route is set the following default data to route declaration

Route::get('/', [Controller::class, 'index'])
		->defaults(\HenryAvila\LaravelNovaMultitenancy\LaravelNovaMultitenancy::SKIP_ROUTE, true);

If the Tenant has domains relationship, allow to define the current tenant based on current domain. The domains relation model, must contain an fqdn attribute with the fqdn domain

Testing

composer test

Changelog

Please see CHANGELOG for more information on what has changed recently.

Contributing

Please see CONTRIBUTING for details.

Security Vulnerabilities

Please review our security policy on how to report security vulnerabilities.

Credits

License

The MIT License (MIT). Please see License File for more information.