Le view in Laravel sono particolari componenti del framework nei quali è possibile definire e salvare la struttura delle pagine HTML e dei file che verranno effettivamente restituiti dalla risposta HTTP. Ciò consente di separare ulteriormente la logica applicativa (route & controller) dalla logica di presentazione (view).
Le view rendono semplice e immediato costruire pagine HTML complesse senza “intaccare” la pulizia del codice dei vari controller. In questo, inoltre, è possibile distinguere le modifiche alla logica di comportamento, sempre nel controller, dalle modifiche visive del contenuto restituito, che potranno essere, quindi, apportate modificando solo la view.
Risposte HTML
Prima di affrontare nel dettaglio le view di Laravel, proviamo a realizzare una response che, effettivamente, restituisca al client che ne fa richiesta una semplice pagina HTML.
Route::get('/hello', function () { return 'Hello Laravel'; });
In questo modo, abbiamo configurato la rotta per fare return di una stringa che Laravel convertirà in una response HTTP. Verranno, quindi, restituiti al client lo stato (200 OK) e alcuni header necessari. In particolare, Laravel aggiungerà alla risposta l’header Content-Type con valore text/html; charset=UTF-8, indicando, quindi, al client di considerare il contenuto ricevuto come file HTML.
Route::get('/hello', function () { return response('Hello Laravel', 200) ->header('Content-Type', 'text/plain') ->cookie('name', 'value', $minutes); });
Possiamo essere più espliciti e utilizzare il metodo response per costruire la risposta desiderata. In questo caso, va indicato il contenuto del body della risposta e il codice HTTP. È possibile anche esplicitare eventuali header per rimpiazzare quelli inseriti di default da Laravel o per aggiungerne degli altri.
A differenza della prima versione, stiamo, qui, dicendo che il contenuto restituito è di tipo text/plain. Il browser, in questo caso, non proverà a farne il rendering come HTML.
Ci sono diversi metodi specifici che è possibile mettere in chain al metodo response per costruire la risposta desiderata.
Route::get('/hello', function () { return response('<html><body><h1>Hello Laravel</h1></body></html>', 200) ->header('Content-Type', 'text/html'); });
Anche il metodo response, però, richiede che venga passato come parametro l’esatto contenuto del body della response sotto forma di stringa. Questo rende particolarmente difficile poter gestire pagine HTML complete e complesse direttamente nella definizione della route o dei controller, poiché dovremmo premurarci di includere nella stringa l’intero sorgente HTML.
Laravel offre la possibilità di ospitare il contenuto HTML da restituire in un file separato tramite le view.
View e logica di presentazione in Laravel
Le view permettono di separare la logica applicativa (che per ora consideriamo essere quanto viene fatto dal controller) dalla logica di presentazione (ovvero come il risultato verrà mostrato a chi ha effettuato la richiesta).
Le view altro non sono che file ospitati nella directory resources/views che costituiranno il contenuto di una risposta. I controller potranno recuperare una certa view tramite una convenzione basata sul nome del file della view e l’uso del metodo view nel controller o nella rotta.
<!-- La view salvata nel file resources/views/hello.blade.php --> <html> <body> <h1>Hello Laravel</h1> <p>I'm a view</p> </body> </html>
// rotta nel file routes/web.php Route::get('/hello', function () { return view('hello'); });
NOTA: sebbene, per semplicità di stesura, gli esempi di questa lezione usino il metodo view nella definizione della rotta, è, ovviamente, possibile usare tale metodo nella classe controller associata alla rotta.
Nomi delle view e relativi file di risorsa in Laravel
Nella prossima lezione approfondiremo meglio il linguaggio di templating Blade; per ora, è sufficiente ricordare che i file delle view nella directory resources/views debbono avere estensione .blade.php poiché sono a tutti gli effetti dei template di Blade.
Il nome del file corrisponderà, quindi, al nome della view da richiedere nel controller. Nell’esempio precedente, la view ‘hello’ corrisponderà al file resources/views/hello.blade.php.
È possibile creare sottodirectory in resources/views in modo da organizzare le varie view realizzate.
Le view raccolte nelle varie sottodirectory saranno richiamabili dal controller tramite una “dot notation”.
return view(‘user.profile’);
Contenuto directory delle view
L’organizzazione delle view all’interno della directory resources/views può essere slegata da nomi di controller e path delle URI gestite. Non è, quindi, necessario che la view user.orders e la view admin.orders corrispondano rispettivamente alle URI https://example.com/user/orders e https://example.com/admin/orders.
Passaggio di dati alle view in Laravel
Il meccanismo delle view di Laravel offre, ovviamente, la possibilità di passare dati dinamici alla singola view selezionata. In questo modo, è possibile realizzare contenuti dinamici.
Il file della view, infatti, è un file template, ossia un file che serve da scheletro per costruire l’effettiva risposta in base ai dati ricevuti.
<!-- La view salvata nel file resources/views/hello.blade.php --> <html> <body> <h1>Hello {{ $name }}</h1> <p>I'm a view</p> </body> </html>
// file routes/web.php Route::view('/hello', 'hello', ['name' => 'Laravel']); Route::get('/hello-bis', function () { return view('hello', ['name' => 'Laravel']); });
È possibile passare un array di dati alla view selezionata per rendere tali dati disponibili alla view. Usando le opportune convenzioni, il sistema di rendering dei template sarà in grado di usare tali dati.
Dal punto di vista dell’invocazione del metodo view, i dati da passare devono essere un array di coppie chiave / valore. Sarà possibile accedere ai valori nella view usando la chiave ($name nell’esempio precedente).
Un metodo alternativo per passare dati alla view è tramite il metodo with, che permette di aggiungere singole coppie chiave / valore.
return view('hello') ->with('name', 'Laravel') ->with('copyright', 2023);
Ciò consente, ad esempio, di strutturare il proprio codice in modo da effettuare all’inizio del codice di un metodo del controller le operazioni necessarie a calcolare i vari valori, associare tali valori ai nomi delle variabili della view in un array e passarli al metodo helper view per generare il contenuto definitivo.
// nella classe controller per la rotta /user/profile public function userProfile() { $userName = $service->getCurrentUserName(); $data = ['firstName' => $username]; return view('user.profile', $data); }