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

Francesco Lettera
3 min readJul 14, 2018

--

Photo by rawpixel on Unsplash

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 un’applicazione Larvel Multi-tenant ci occuperemo di :

✅ Creare un token e notificarlo all’admin via email

✅ Creare una pagina per impostare la password

Nel momento in cui creiamo un admin per un nuovo tenant, auto assegniamo una password random per l’account e la stampiamo in modo tale che l’admin possa loggarsi utilizzando questa password. Questo è corretto, forse, per un MVP ma è piuttosto strano per un’app reale perché stiamo costruendo un’app reale, o no?

Quindi, invece di stampare a video la password, mandaremo una email all’admin come invito per permettergli di sapere che un tenant è stato creato.

Spedire una email con Laravel è piuttosto facile, ma come impostiamo una gestione di inviti? Abbiamo un po’ di cose di cui preoccuparci — impostare tabelle, creare token, verificare il token e assicurarci che tutto sia collegato, ecc. C’è un bel po’ di codice che potrebbe spaventare i più!

Ma Laravel ci viene incontro con quasi tutto il codice per gestire questo caos: con il Password Resets. Vediamo come possiamo usare questa feature con un po’ di codice scritto da noi.

1. Creare un token e notificarlo all’admin

Dobbiamo creare un token a scadenza nel database utilizzando la classe PasswordBroker prima di tutto e inviare via email questo token all’utente. Creiamo la classe di notifica TenantCreated che è responsabile delle notifiche all’admin. Puoi utilizzare il comando artisan per creare velocemente la classe:

php artisan make:notification TenantCreated

Niente di eccezionale fin qui, niente di diverso dal Laravel Notifications- abbiamo notificato all’utente via email dopo aver aver generato un corretto “subdomain URL”.

Alla linea 25, abbiamo creato l’effettivo token che è diventato persistente grazie al database. Alla linea 26, abbiamo creato un reset URL per redirezionare l’utente all’url del tenant quando clicca sul link nell’email: ecco perché nell’URL gli passiamo l’hostname.

2. Invitare l’admin

Ecco come notificare nell’handle() di CreateTenant.php:

...$password = str_random();
$this->addAdmin($name, $email, $password)
->notify(new TenantCreated($hostname));
$this->info("Tenant '{$name}' is created and is now accessible at {$hostname->fqdn}");
$this->info("Admin {$email} has been invited!");
...

Se crei un nuovo tenant utilizzando tenant:create (comando artisan), dovresti ricevere una email per settare la tua password. Assicurati di aver impostato MAIL_DRIVER e MAIL_HOST nel tuo file .env. Prova!

Cosa è accaduto? Un errore che dice “Route [password.reset] not defined.”? Sembra corretto!

Se ti ricordi, non abbiamo definito alcuna route chiamata password.reset che invitasse un utente ad inserire una email, così come ad inserire una nuova password. Abbiamo bisogno non solo di una route per mostrare il form, ma anche della pagina stessa, la route per postare la nuova password, validazione e tutto il resto! Quanto lavoro?

Niente paura! Laravel ci viene ancora una volta in soccorso con un’authentication bella e pronta. E tutto quello di cui abbiamo bisogno è utilizzare un comando artisan:

php artisan make:auth

Adesso cerca di creare un nuovo tenant ancora una volta, e tutto dovrebbe funzionare a dovere! Dovresti ricevere una email e se clicchi sul link per il reset password nell’email dovresti essere reindirizzato nella pagina di reset.

Sfortunatamente, se clicchi sul pulsante di Reset Password, il sistema ti restituirà una QueryException a proposito di una tabella password_resets mancante. Se dai un’occhiata al database tenant, vedrai che è già presente una tabella chiamata password_resets. Allora, cosa è successo? E come possiamo sistemare? Ne parleremo nel prossimo post.

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

https://laravel.happyflow.it/

--

--