Padroneggiare i percorsi Laravel
Pubblicato: 2022-12-12Quando si tratta del back-end, gli sviluppatori alla fine incontrano percorsi. Le route possono essere considerate la spina dorsale del back-end poiché ogni richiesta ricevuta dal server viene reindirizzata a un controller tramite un elenco di routing che mappa le richieste ai controller o alle azioni.
Laravel ci nasconde molti dettagli di implementazione e viene fornito con molto zucchero sintattico per aiutare sia gli sviluppatori nuovi che quelli esperti a sviluppare le loro applicazioni web.
Diamo un'occhiata da vicino a come gestire i percorsi in Laravel.
Backend Routing e Cross-Site Scripting in Laravel
Su un server esistono route pubbliche e private. Le rotte pubbliche possono essere motivo di preoccupazione a causa della possibilità di cross-site scripting (XSS), un tipo di attacco injection che può lasciare te e i tuoi utenti vulnerabili ad attori malintenzionati.
Il problema è che un utente può essere reindirizzato da un percorso che non richiede un token di sessione a uno che lo richiede e avrà comunque accesso senza il token.
Il modo più semplice per risolvere questo problema è applicare una nuova intestazione HTTP, aggiungendo "referrer" al percorso per mitigare questo scenario:
'main' => [ 'path' => '/main', 'referrer' => 'required,refresh-empty', 'target' => Controller\DashboardController::class . '::mainAction' ]
Instradamento di base di Laravel
In Laravel, le route consentono agli utenti di instradare la richiesta appropriata al controller desiderato. Il percorso Laravel più semplice accetta un identificatore di asset uniforme (il percorso del percorso) e una chiusura che può essere sia una funzione che una classe.
In Laravel, i percorsi vengono creati all'interno dei file web.php e api.php . Laravel viene fornito con due percorsi per impostazione predefinita: uno per il WEB e uno per l'API.
Queste rotte risiedono nella cartella route/ , ma sono caricate in Providers/RouteServiceProvider.php .
Invece di fare questo, possiamo caricare i percorsi direttamente all'interno di RouteServiceProvider.php , saltando del tutto la cartella route/ .
Reindirizzamenti
Quando definiamo un percorso, di solito vorremmo reindirizzare l'utente che vi accede e le ragioni per questo variano molto. Potrebbe essere perché è un percorso obsoleto e abbiamo cambiato il backend o il server, oppure potrebbe essere perché vogliamo installare l'autenticazione a due fattori (2FA) e così via.
Laravel ha un modo semplice per farlo. Grazie alla semplicità del framework, possiamo utilizzare il metodo redirect sulla facciata di Route, che accetta la route di ingresso e la route a cui essere reindirizzati.
Facoltativamente, possiamo fornire il codice di stato per il reindirizzamento come terzo parametro. Il metodo permanentRedirect
farà la stessa cosa del metodo redirect
, eccetto che restituirà sempre un codice di stato 301:
// Simple redirect Route::redirect("/class", "/myClass"); // Redirect with custom status Route::redirect("/home", "/office", 305); // Route redirect with 301 status code Route::permanentRedirect("/home", "office");
All'interno delle rotte di redirect è vietato utilizzare come parametri le parole chiave “destination” e “status” in quanto riservate da Laravel.
// Illegal to use Route::redirect("/home", "/office/{status}");
Visualizzazioni
Le visualizzazioni sono . blade.php che utilizziamo per il rendering del frontend della nostra applicazione Laravel. Utilizza il motore di template blade ed è il modo predefinito per creare un'applicazione full-stack utilizzando solo Laravel.
Se vogliamo che il nostro percorso restituisca una vista, possiamo semplicemente utilizzare il metodo di visualizzazione sulla facciata del percorso. Accetta un parametro di route, un nome di visualizzazione e un array facoltativo di valori da passare alla visualizzazione.
// When the user accesses my-domain.com/homepage // the homepage.blade.php file will be rendered Route::view("/homepage", "homepage");
Supponiamo che la nostra vista voglia dire "Ciao, {name}
" passando un array facoltativo con quel parametro. Possiamo farlo con il seguente codice (se il parametro mancante è richiesto nella vista, la richiesta fallirà e genererà un errore):
Route::view('/homepage', 'homepage', ['name' => "Kinsta"]);
Elenco percorsi
Con l'aumentare delle dimensioni della tua applicazione, aumenterà anche il numero di richieste che devono essere instradate. E con un grande volume di informazioni può derivare una grande confusione.
È qui che il artisan route:list command
può aiutarci. Fornisce una panoramica di tutte le route definite nell'applicazione, i relativi middleware e controller.
php artisan route:list
Visualizzerà un elenco di tutti i percorsi senza i middleware. Per questo, dobbiamo usare il flag -v
:
php artisan route:list -v
In una situazione in cui potresti utilizzare la progettazione guidata dal dominio in cui i tuoi percorsi hanno nomi specifici nei loro percorsi, puoi utilizzare le funzionalità di filtro di questo comando in questo modo:
php artisan route:list –path=api/account
Questo mostrerà solo i percorsi che iniziano con api/account .
D'altra parte, possiamo istruire Laravel a escludere o includere percorsi definiti da terze parti utilizzando le opzioni –except-vendor
o –only-vendor
.
Parametri percorso
A volte potrebbe essere necessario acquisire segmenti dell'URI con il percorso, come un ID utente o un token. Possiamo farlo definendo un parametro di rotta, che è sempre racchiuso tra parentesi graffe ( {}
) e dovrebbe consistere solo di caratteri alfabetici.
Se i nostri percorsi hanno dipendenze all'interno dei loro callback, il contenitore del servizio Laravel li inietterà automaticamente:
use Illuminate\Http\Request; use Controllers/DashboardController; Route::post('/dashboard/{id}, function (Request $request, string $id) { return 'User:' . $id; } Route::get('/dashboard/{id}, DashboardController.php);
Parametri richiesti
I parametri obbligatori di Laravel sono parametri nei percorsi che non siamo autorizzati a saltare quando effettuiamo una chiamata. In caso contrario, verrà generato un errore:
Route::post("/gdpr/{userId}", GetGdprDataController.php");
Ora all'interno di GetGdprDataController.php avremo accesso diretto al parametro $userId .
public function __invoke(int $userId) { // Use the userId that we received… }
Un percorso può prendere qualsiasi numero di parametri. Vengono inseriti nei callback/controller del percorso in base all'ordine in cui sono elencati:
// api.php Route::post('/gdpr/{userId}/{userName}/{userAge}', GetGdprDataController.php); // GetGdprDataController.php public function __invoke(int $userId, string $userName, int $userAge) { // Use the parameters… }
Parametri facoltativi
In una situazione in cui vogliamo fare qualcosa su un percorso quando è presente solo un parametro e nient'altro, il tutto senza influire sull'intera applicazione, possiamo aggiungere un parametro opzionale. Questi parametri facoltativi sono indicati con ?
ad essi aggiunti:
Route::get('/user/{age?}', function (int $age = null) { if (!$age) Log::info("User doesn't have age set"); else Log::info("User's age is " . $age); } Route::get('/user/{name?}', function (int $name = "John Doe") { Log::info("User's name is " . $name); }
Carattere jolly percorso
Laravel ci fornisce un modo per filtrare come dovrebbero apparire i nostri parametri facoltativi o obbligatori.
Diciamo che vogliamo una stringa di un ID utente. Possiamo convalidarlo in questo modo a livello di percorso utilizzando il metodo where
.
Il metodo where
accetta il nome del parametro e la regola regex che verrà applicata alla validazione. Per impostazione predefinita, prende il primo parametro, ma se ne abbiamo molti, possiamo passare un array con il nome del parametro come chiave e la regola come valore, e Laravel li analizzerà tutti per noi:
Route::get('/user/{age}', function (int $age) { // }->where('age', '[0-9]+'); Route::get('/user/{age}', function (int $age) { // }->where('[0-9]+'); Route::get('/user/{age}/{name}', function (int $age, string $name) { // }->where(['age' => '[0-9]+', 'name' => '[az][Az]+');
Possiamo fare un ulteriore passo avanti e applicare la convalida a tutti i percorsi nella nostra applicazione utilizzando il metodo pattern
sulla facciata del Route
:
Route::pattern('id', '[0-9]+');
Questo validerà ogni parametro id
con questa espressione regex. E una volta definito, verrà applicato automaticamente a tutti i percorsi utilizzando quel nome di parametro.
Come possiamo vedere, Laravel utilizza il carattere /
come separatore nel percorso. Se vogliamo usarlo nel percorso, dobbiamo consentirgli esplicitamente di far parte del nostro segnaposto usando una regex where
.
Route::get('/find/{query}', function ($query) { // })->where('query', , '.*');
L'unico aspetto negativo è che sarà supportato solo nell'ultimo segmento di percorso.
Percorsi denominati
Come suggerisce il nome, possiamo assegnare un nome ai percorsi, il che rende conveniente generare URL o reindirizzare per percorsi specifici.
Come creare percorsi denominati
Un modo semplice per creare un percorso con nome è fornito dal metodo name
concatenato sulla facciata Route
. Il nome di ogni percorso deve essere univoco:
Route::get('/', function () { })->name("homepage");
Gruppi di percorsi
I gruppi di route consentono di condividere attributi di route come middleware su un gran numero di route senza doverli ridefinire su ogni singola route.
Middleware
L'assegnazione di un middleware a tutti i percorsi che abbiamo ci consente di combinarli in un gruppo, prima utilizzando il metodo group
. Una cosa da considerare è che i middleware vengono eseguiti nell'ordine in cui vengono applicati al gruppo:
Route:middleware(['AuthMiddleware', 'SessionMiddleware'])->group(function () { Route::get('/', function() {} ); Route::post('/upload-picture', function () {} ); });
Controllori
Quando un gruppo utilizza lo stesso controller, possiamo utilizzare il metodo controller
per definire il controller comune per tutti i percorsi all'interno di quel gruppo. Ora dobbiamo specificare il metodo che il percorso chiamerà.
Route::controller(UserController::class)->group(function () { Route::get('/orders/{userId}', 'getOrders'); Route::post('/order/{id}', 'postOrder'); });
Instradamento sottodominio
Un nome di sottodominio è un'informazione aggiuntiva aggiunta all'inizio del nome di dominio di un sito web. Ciò consente ai siti Web di separare e organizzare i propri contenuti per funzioni specifiche, come negozi online, blog, presentazioni e così via dal resto del sito Web.
I nostri percorsi possono essere utilizzati per gestire il routing del sottodominio. Possiamo catturare il dominio e una parte del sottodominio per l'utilizzo nel nostro controller e route. Con l'aiuto del metodo domain
sulla facciata Route
, possiamo raggruppare i nostri percorsi sotto un unico dominio:
Route::domain('{store}.enterprise.com')->group(function() { Route::get('order/{id}', function (Account $account, string $id) { // Your Code } });
Prefissi e prefissi di nomi
Ogni volta che abbiamo un gruppo di percorsi, invece di modificarli uno per uno, possiamo utilizzare le utilità extra fornite da Laravel, come prefix
e name
sulla facciata Route
.
Il metodo prefix
può essere utilizzato per prefissare ogni route nel gruppo con un determinato URI e il metodo name
può essere utilizzato per prefissare ogni nome di route con una determinata stringa.
Questo ci consente di creare nuove cose come percorsi di amministrazione senza dover modificare ogni singolo nome o prefisso per identificarli:
Route::name('admin.")->group(function() { Route::prefix("admin")->group(function() { Route::get('/get')->name('get'); Route::put('/put')->name(put'); Route::post('/post')->name('post'); }); });
Ora gli URI per questi percorsi saranno admin/get
, admin/put
, admin/post
e i nomi admin.get
, admin.put
e admin.post
.
Cache del percorso
Quando si distribuisce l'applicazione sui server di produzione, un buon sviluppatore Laravel trarrà vantaggio dalla route cache di Laravel.
Che cos'è la memorizzazione nella cache del percorso?
La memorizzazione nella cache del percorso riduce il tempo necessario per registrare tutti i percorsi dell'applicazione.
Eseguendo php artisan route:cache
viene generata un'istanza di Illuminate/Routing/RouteCollection
e, dopo essere stata codificata, l'output serializzato viene scritto in bootstrap/cache.routes.php
.
Ora qualsiasi altra richiesta caricherà questo file di cache se esiste. Pertanto, la nostra applicazione non deve più analizzare e convertire le voci dal file di route in oggetti Illuminate/Routing/Route
in Illuminate/Routing/RouteCollection
.
Perché è importante utilizzare la cache del percorso
Non utilizzando la funzione di memorizzazione nella cache del percorso fornita da Laravel, la tua applicazione rischia di funzionare più lentamente di quanto potrebbe essere, il che potrebbe a sua volta ridurre le vendite, la fidelizzazione degli utenti e la fiducia nel tuo marchio.
A seconda della scala del tuo progetto e del numero di percorsi disponibili, l'esecuzione di un semplice comando di memorizzazione nella cache del percorso può accelerare la tua applicazione ovunque dal 130% al 500%, un enorme guadagno per quasi nessuno sforzo.
Riepilogo
Il routing è la spina dorsale dello sviluppo back-end. Il framework Laravel eccelle in questo fornendo un modo dettagliato di definire e gestire i percorsi.
Lo sviluppo può infatti essere accessibile a tutti e aiutare a velocizzare un'applicazione solo in virtù del fatto che è stata creata in Laravel.
Quali altri trucchi e suggerimenti hai riscontrato riguardo ai percorsi di Laravel? Facci sapere nella sezione commenti!