Molto spesso durante lo sviluppo di un'applicazione si ha la necessità di mostrare messaggi di feedback ad un utente dopo una determinata azione. Ad esempio, dopo che la compilazione di un form va a buon fine oppure dopo aver cliccato su di un qualche pulsante che abilita o disabilita una feature.
Symfony, attraverso le sessioni, ci mette a disposizione un tool molto interessante per gestire dei messaggi che possono essere visualizzati dopo una specifica azione e che scompaiono una volta visualizzati dall’utente: stiamo parlando dei FlashBag Messages.
Aggiungere un messaggio di successo dopo la registrazione
Vediamo insieme come sia possibile replicare lo screenshot del messaggio di successo visto nel precedente paragrafo con pochissimo sforzo, aggiungendo soltanto una riga di codice nel controller e qualche riga nel template della home page.
Come prima cosa apriamo il RegistrationController
e aggiungiamo il nostro messaggio subito dopo aver persistito l'utente:
$entityManager->flush();
// do anything else you need here, like send an email
$this->addFlash('success', "The account {$user->getUsername()} has been created!");
Il metodo addFlash()
è un helper che si occupa di fare per noi il "lavoro sporco" di recuperare dalla sessione il Bag che contiene questa tipologia di messaggi e aggiungere il nostro messaggio.
Come abbiamo notato i parametri utilizzati sono due, questo perché il primo parametro indica il tipo di messaggio. È anch’esso una stringa e non abbiamo nessun vincolo sul nome da dargli, ci consente quindi di differenziare facilmente i messaggi in base all'utilizzo che dobbiamo farne.
Il codice in alto, quindi, verrà eseguito subito dopo la registrazione di un utente. Questo implica che dopo il redirect la pagina di destinazione dovrà essere in grado di visualizzare il messaggio, in caso contrario il messaggio resterà in sessione finché non verrà visualizzata una pagina che ne supporta la visualizzazione.
Apriamo a questo punto il template della home page app/templates/home/index.html.twig
ed aggiungiamo, subito prima della Timeline, il codice per stampare il flash message:
{% for label, messages in app.flashes(['success', 'danger']) %}
{% for message in messages %}
<div class="alert alert-{{ label }}">
{{ message }}
</div>
{% endfor %}
{% endfor %}
Il metodo app.flashes()
prende in ingresso le tipologie di messaggi che vogliamo stampare (nel nostro caso oltre a success
potrebbe essere utile gestire già eventuali messaggi di errore, da qui danger
come la classe utilizzata da Bootstrap) e restituisce un array con il tipo di messaggio e la stringa. A questo punto cicliamo i messaggi all'interno di ogni tipo e per ognuno di essi stampiamo un Alert di Bootstrap con la classe apposita.
Per approfondimenti sui FlashBag Messages e la FlashBagInterface API si può fare riferimento alla documentazione ufficiale.
Il codice della lezione è disponibile con il tag flashbag
.