Come realizzare un’applicazione Laravel Multi-tenant — Parte 2

Francesco Lettera
4 min readJul 7, 2018

--

Parte 0 | Parte 1 | Parte 2 | Parte 3 | Parte 4 | Parte 5 | Parte 6

Questa è la traduzione della serie Full-featured multi-tenant Laravel app from scratch di Ashok Gelal

In questa parte, su come scrivere una completa applicazione Laravel Multi-Tenant, tratteremo i seguenti step:

✅ Installare e configurare un package per gestire role e permission

✅ Riempire un database con qualche role e permission

✅ Impostare tutti i permessi di cui ha bisogno un admin user per amministrare un nuovo tenant

1. Installare e configurare un package per gestire role e permission

Utilizzeremo l’eccellente package di spatie laravel-permission per gestire role e permission nella nostra multi-tenant app (MTA) [Adesso confronta anche la gestione di Gate e Policies nella nuova versione di Laravel, ndt] .
Dai un’occhiata alla sua documentazione, prima. Non hai bisogno di comprendere tutto adesso, ma acquisisci familiarità con alcuni concetti e comandi.

Appena lo avrai fatto, aggiungi il package:

composer require spatie/laravel-permission

Adesso dobbiamo rendere questo package “consapevole” del setup multi-tenancy impostando una corretta connessione con il package core di Eloquent Permission e Role.

Non dobbiamo cambiare questi model, naturalmente nella directory vendor per renderli adatti al multi-tenancy. Dobbbiamo, invece, creare i nostri model Role e permission e permettere che il package possa utilizzare questi model al posto dei model del package. Questo può essere fatto impostando il config file del package. Pubblichiamolo nella nostra app, prima di tutto:

php artisan vendor:publish

Poi seleziona:

Provider: Spatie\Permission\PermissionServiceProvider

Questo pubblicherà due file — config/permission.php e xxxx_xx_xx_xxxxxx_create_permission_tables.php.

Il file di migrazione xxxx_xx_xx_xxxxxx_create_permission_tables.php deve essere spostato in database/migrations/tenant folder. Fallo.

Facciamo i cambiamenti di cui abbiamo bisogno config/permission.php:

'models' => [
'permission' => App\Permission::class,
'role' => App\Role::class,
],

Come puoi vedere, abbiamo detto al package di utilizzare App\Permission::class and App\Role::class i due Eloquent model per permission e role. Questi model non esistono ancora, quindi creiamoli:

php artisan make:model Permission
php artisan make:model Role

Questi due nuovi model sono elementari e non fanno ancora nulla . Dobbiamo impostarli entrambi per farli funzionare con il package laravel-permission e il nostro multi-tenancy setup.

Per il primo, utilizzeremo la magia dell’ereditarietà e per il secondo utilizzeremo il trait.

Editiamo Permission.php prima:

Quindi il model Role.php:

2. Carichiamo il database con le iniziali role e permission

Vorremo avere un database tenant con qualche dato di role e permission ogni volta che un tenant è creato. Questo package multi-tenant già supporta il seeding out-of-the-box. Tutto quello di cui abbiamo bisogno è dirglielo. Edita config/tenancy.php e facciamo un piccolo cambiamento:

...
'tenant-seed-class' => TenantDatabaseSeeder::class,
...

Questo avvierà la classe database/seeds/TenantDatabaseSeeder.php dopo che il database tenant è creato. Creiamo il seeder:

php artisan make:seeder TenantDatabaseSeeder

E poi facciamo i nostri cambiamenti:

Avrai notato che abbiamo aggiunto tre “admin permissions”, creato un admin role e applicato questi permessi all’admin role. Abbiamo anche creato un role per i nostri utenti regolari. Non preoccuparti di che tipo di permission e role abbiamo aggiunto. In futuro, ci ritorneremo su e aggiungeremo più permission e role necessari.

Prima di andare oltre, assicurati di aver spostato database/migrations/xxxx_xx_xx_xxxxxx_create_permission_tables.php nella cartella database/migrations/tenant.

3. Rendiamo il nostro user un admin con nuove role e permission

Nella prima parte di questa serie, abbiamo aggiunto un admin user ma non abbiamo caricato questo user con nessun “super power” tale da renderlo un admin. Lo faremo adesso!

Ma prima di questo abbiamo bisogno di impostare il nostro User model adatto per il multi-tenancy così come abbiamo fatto per i Role e Permission, e questo significa che entrambi hanno bisogno di UsesTenantConnection e HasRole trait. Andiamo avanti e applichiamo i trait allo User.php Model.

Adesso, edita CreateTenant.php e modifica il metodo addAdmin in modo che appaia così:

...
private function
addAdmin($name, $email, $password)
{
$admin = User::create(['name' => $name, 'email' => $email, 'password' => Hash::make($password)]);
$admin->guard_name = 'web';
$admin->assignRole('admin');
return $admin;
}
...

Abbiamo aggiunto due linee di codice — la prima linea è necessaria perchè il package laravel-permission supporti guards perchè in questo modo potresti avere differenti role, ad esempio, per il web e per le API. Se tu dovessi usare una web UI per aggiungere un admin, non avresti bisogno di questo, ma siccome stiamo creando un tenant con un comando artisan, abbiamo bisogno di impostarlo manualmente.

La seconda linea serve a rendere uno user un admin.

Adesso, andiamo avanti e creiamo un nuovo tenant:

php artisan tenant:create boston boston@example.com

Dovresti vedere questo fantastico messaggio:

Quindi, scegli il database tenant e scoprirai la presenza di nuove tabelle — model_has_permissions, model_has_roles, role_has_permissions, e roles.

In futuro, quando avremo una UI per gestire utenti e contenuti, il lavoro che abbiamo fatto in questo post avrà un senso.

Nel prossimo post, vedremo come dare il benvenuto al nuovo admin con un invito via email e allo stesso modo come gli faremo impostare una nuova password.

Sei già iscritto alla Laravel Letter? No???
https://laravel.happyflow.it/

https://laravel.happyflow.it/

--

--