Laravel visualizzazione messaggi validazione form

Laravel non mi visualizzava i messaggi di errore riscontrati nella validazione di una form. E questo mi ha mandato a spasso per qualche ora tra google e Laracast.

Laravel ti consente di fare le cose tanto semplicemente, quando si tratta di sviluppare un sito. Ma altrettanto facilmente riesce a farti girare a vuoto per un’ora alla ricerca di una soluzione tutto sommato banale.

Vediamo cosa è successo:

Route::group(['middleware' => ['web']], function () {

    Route::get('/signup', function () {
        return view('signup');
    });

    Route::post('/signup', function (Request $request) {
        $validator = Validator::make($request->all(), [
                    'email' => 'required|email|unique:users',
        ]);

        if ($validator->fails()) {
            return redirect('/signup')
                            ->withInput()
                            ->withErrors($validator);
        }

        $user = new User;
        $user->email = $request->email;
        $user->save();

        return redirect('/signup');
    });
});

Il codice riporta semplicemente il minimo indispensabile di alcune route e delle rispettive clousure. In particolare il problema che mi si presentava e che nonostante tutto funzionasse correttamente (apparentemente: vedevo la pagina nel browser ma…),  la condizione di validazione del campo email specificata in riga 9, doveva far fallire la validazione in presenza di un’email vuota, e il flusso doveva ritornare alla pagina “signup” di partenza eseguendo la riga 13. L’errore di validazione del campo email non veniva visualizzato nella pagina come mi sarei aspettato.

Probabilmente il problema è che la riga è la 13 ed oggi è un 17?

Una serie infinita di Log::debug($tuttoIlMondoConosciuto); ma niente. Il flusso entrava correttamente nel blocco if, e la riga 13 era raggiunta ed eseguita. L’array con gli errori veniva passato di ritorno alla vista, ma la tipica struttura di blade non visualizzava nulla in pagina. Vuoto assoluto.

Ecco il template blade minimo per gli errori:

@if (count($errors) >0)
<div class="alert alert-danger"> 
    <strong>Whoops! Something went wrong!</strong>
    <br><br> 
    <ul>
        @foreach ($errors->all() as $error)
        <li>{{ $error }}</li>
        @endforeach
    </ul>
</div> 
@endif

La soluzione è sempre banale

Il segreto sta tutto nel leggere la documentazione. Tanta documentazione. Sopratutto su un prodotto come Laravel che cambia molto velocemente.

Ecco a confronto la modifica che ha risolto il problema:

//Prima: 
Route::group(['middleware' => ['web']], function () {

//Dopo: corretta 
Route::group(['middlewareGroups' => ['web']], function () {

Probabilmente nella documentazione era indicata nelle prime dieci righe. Ma sembra che sia una cosa che sbagliamo in tanti viste le numerose segnalazioni che ho letto prima di trovare la soluzione corretta.

Leave a Comment

Your email address will not be published. Required fields are marked *