henryavila / laravel-nova-multitenancy
Integrate the multi tenancy single database in Laravel Nova.
Requires
- php: ^8.2
- illuminate/contracts: ^9.0|^10.0|^11.0
- spatie/laravel-multitenancy: ^3.0.2
- spatie/laravel-package-tools: ^1.14.0
Requires (Dev)
- laravel/pint: ^1.0
- nunomaduro/collision: ^6.0
- nunomaduro/larastan: ^2.0.1
- orchestra/testbench: ^7.0
- pestphp/pest: ^1.21
- pestphp/pest-plugin-laravel: ^1.1
- phpstan/extension-installer: ^1.1
- phpstan/phpstan-deprecation-rules: ^1.0
- phpstan/phpstan-phpunit: ^1.0
- phpunit/phpunit: ^9.5
- spatie/laravel-ray: ^1.26
This package is auto-updated.
Last update: 2024-11-11 19:35:38 UTC
README
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
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.