03 Le rotte di laravel

Le Routes (rotte) sono i percorsi presenti nell’url presenti dopo la radice dell’indirizzo, ovvero il nome del dominio con la sua estensione. Per esempio in questo indirizzo

https://laravel.com/docs/8.x/installation

la sua rotta è /docs/8.x/installation.

Se per esempio nella nostra url andiamo ad inserire la rotta users

http://127.0.0.1:8000/users

riceveremo oltre la pagina di errore 404, una serie di informazioni visionabili dall’inspector del browser

Se volessimo fare rispondere laravel a questa url, basterà andare ad inserire la nostra rotta nel file /routes/web.php, dove troviamo la rotta impostata di default

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

Analizzandola, scopriamo che il metodo get() della classe Route(), quando incontra l’url radice /, restituisce la vista welcome. Laravel andrà a cercare di predefinito nella cartella resources/views il file welcom.php (oppure welcome.blade.php).

Diciamo ora a laravel che se viene richiesta la rotta /users dovrà restituire una vista che chiameremo users

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

creiamo la relativa vista users.php dentro a resources/views

<h1>Questa è la view users</h1>

Volendo, invece che far ritornare una view, possiamo far restituire un array con dei dati

Route::get('/users', function () {
 return ['Gianni','Davide','Paolo'];
 // return view('users');
});

Laravel trasformerà automaticamente l’array in un JSON da restituire al browser.

Stessa cosa possiamo far restituire un array di oggetti trasformati in JSON

Route::get('/users', function () {
 $users = [];
 foreach (range(0,10) as $index) {
  $user = new stdClass();
  $user->nome = 'Faghy '.$index;
  $user->cognome = 'Pingwie '.$index;
  $users[] = $user;
 }
 return $users;
});

analizzando ogni indice, troveremo l’oggetto contenente le coppie chiavi : valori

0: {nome: "Faghy 0", cognome: "Pingwie 0"}
 cognome: "Pingwie 0"
 nome: "Faghy 0"

Come leggiamo nei commenti iniziali del file routes/web.php, in questo file vengono impostate le rotte che vengono caricate da RouteServiceProvider all’interno di un gruppo che contiene il gruppo middlewareweb“. Quando laravel viene avviato ed effettua la parte di bootstrap a partire dal file index.php verranno caricati tutti i providers definiti nel file config/app.php ( i providers sono dei fornitori di servizi ovvero delle classi che hanno dei loro metodi). Oltre che i providers del framewark verranno lanciati anche quelli dell’app contenuti nella cartella app/Providers e se presente all’interno sarà lanciato il metodo register(). Tra i file provider troviamo per esempio RouteServiceProvider che ha il suo metodo boot() dove troviamo il metodo configureRateLimiting per configurare il numero di richieste al secondo e altre opzioni per configurare i limiti delle api. Subito dopo, sempre in boot(), vengono chiamate le rotte

$this->routes(function () {
 Route::middleware('web')
  ->namespace($this->namespace)
  ->group(base_path('routes/web.php'));
});

Come si vede, viene definito che tutte le rotte contenute in routes/web.php avranno il middleware web. Questo tipo di middleware è predefinito in laravel e le proprietà del gruppo web sono definite a sua volta nel file app/Http/Kernel.php

protected $middlewareGroups = [
'web' => [
 \App\Http\Middleware\EncryptCookies::class,
 \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
 \Illuminate\Session\Middleware\StartSession::class,
 \Illuminate\Session\Middleware\AuthenticateSession::class,
 \Illuminate\View\Middleware\ShareErrorsFromSession::class,
 \App\Http\Middleware\VerifyCsrfToken::class,
 \Illuminate\Routing\Middleware\SubstituteBindings::class,
]

Tutti questi middleware con le loro funzionalità saranno presenti nel middleware group web, per esempio qui si possono anche disabilitare, se per esempio volessimo nello sviluppo eliminare la verifica del token, basterà commentare la linea

// \App\Http\Middleware\VerifyCsrfToken::class,

Quindi ogni rotta creata in routes/web.php appartrerrà automaticamente al gruppo del middleware web con le sue peculiarità.

Rotte in file personalizzato

Se per esempio volessimo separare le rotte creandone specifiche per un’ipotetica interfaccia di admin, mettendole in un file separato da routes/web.php per ordinare il tutto. Creiamo il file routes/admin.php

Route::get('/', function () {
 return 'Ciao Admin';
});

adesso in RouteServiceProvider aggiungiamo nel metodo boot() la nostra rotta personalizzata

Route::prefix('admin')
 ->middleware('web')
 ->group(base_path('routes/admin.php'));

abbiamo caricato la rotta admin, aiutati dalla funzione helper base_path() che restituisce il percorso radice della nostra applicazione, abbiamo messo il prefisso admin e abbiamo assegnato il middleware web.

Possiamo quindi creare file contenenti specifiche rotte creando un codice più pulito, infatti se per esempio aggiungiamo la rotta dashboard in admin.php

Route::get('/dashboard', function () {
return 'Ciao Dashboard';
});

Se ora visitiamo

http://localhost:8000/admin/dashboard

La nostra rotta verrà soddisfatta