Stăpânirea rutelor Laravel

Publicat: 2022-12-12

Când vine vorba de backend, dezvoltatorii întâlnesc în cele din urmă rute. Rutele pot fi considerate coloana vertebrală a backend-ului, deoarece fiecare cerere pe care o primește serverul este redirecționată către un controler printr-o listă de rutare care mapează cererile către controlori sau acțiuni.

Laravel ascunde multe detalii de implementare pentru noi și vine cu o mulțime de zahăr sintactic pentru a ajuta atât dezvoltatorii noi, cât și cei experimentați să-și dezvolte aplicațiile web.

Să aruncăm o privire atentă la cum să gestionăm rutele în Laravel.

Rutare backend și scriptare între site-uri în Laravel

Pe un server, există atât rute publice, cât și private. Rutele publice pot fi un motiv de îngrijorare din cauza posibilității de cross-site scripting (XSS), un tip de atac prin injecție care vă poate lăsa pe dvs. și utilizatorii vulnerabili la actori rău intenționați.

Problema este că un utilizator poate fi redirecționat de la o rută care nu necesită un token de sesiune către una care o face - și va avea în continuare acces fără simbolul. Faceți clic pentru a trimite pe Tweet

Cel mai simplu mod de a rezolva această problemă este de a aplica un nou antet HTTP, adăugând „referitor” la rută pentru a atenua acest scenariu:

 'main' => [ 'path' => '/main', 'referrer' => 'required,refresh-empty', 'target' => Controller\DashboardController::class . '::mainAction' ]

Ruta de bază Laravel

În Laravel, rutele permit utilizatorilor să direcționeze cererea corespunzătoare către controlerul dorit. Cea mai simplă rută Laravel acceptă un identificator uniform de bun (calea traseului dvs.) și o închidere care poate fi atât o funcție, cât și o clasă.

În Laravel, rutele sunt create în interiorul fișierelor web.php și api.php . Laravel vine cu două rute în mod implicit: una pentru WEB și una pentru API.

Aceste rute se află în folderul rute/ , dar sunt încărcate în Providers/RouteServiceProvider.php .

O linie de comandă care arată starea implicită a furnizorului de servicii de rută Laravel.
Starea implicită a furnizorului de servicii de rută Laravel.

În loc să facem acest lucru, putem încărca rutele direct în RouteServiceProvider.php , sărind cu totul rutele/ folderul.

O fereastră de linie de comandă care arată încărcarea rutelor Laravel direct în furnizor.
Încărcarea rutelor Laravel direct în furnizor.

Redirecționări

Când definim o rută, de obicei vom dori să redirecționăm utilizatorul care o accesează, iar motivele pentru aceasta variază foarte mult. Poate fi pentru că este o rută depreciată și am schimbat backend-ul sau serverul, sau poate pentru că dorim să instalăm autentificarea cu doi factori (2FA) și așa mai departe.

Laravel are un mod ușor de a face acest lucru. Datorită simplității cadrului, putem folosi metoda de redirecționare pe fațada Rutei, care acceptă ruta de intrare și ruta către care urmează să fie redirecționat.

Opțional, putem da codul de stare pentru redirecționare ca al treilea parametru. Metoda permanentRedirect va face la fel ca metoda redirect , cu excepția faptului că va returna întotdeauna un cod de stare 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");

În cadrul rutelor de redirecționare ne este interzis să folosim cuvintele cheie „destinație” și „stare” ca parametri, deoarece acestea sunt rezervate de Laravel.

 // Illegal to use Route::redirect("/home", "/office/{status}");

Vizualizări

Vizualizările sunt . blade.php pe care le folosim pentru a reda interfața aplicației noastre Laravel. Utilizează motorul de modelare blade și este modalitatea implicită de a construi o aplicație full-stack folosind numai Laravel.

Dacă dorim ca traseul nostru să returneze o vedere, putem folosi pur și simplu metoda de vizualizare pe fațada Rutei. Acceptă un parametru de rută, un nume de vizualizare și o matrice opțională de valori care urmează să fie transmise vizualizării.

 // When the user accesses my-domain.com/homepage // the homepage.blade.php file will be rendered Route::view("/homepage", "homepage");

Să presupunem că punctul nostru de vedere vrea să spună „Bună ziua, {name} ” prin trecerea unei matrice opționale cu acel parametru. Putem face exact asta cu următorul cod (dacă parametrul lipsă este necesar în vizualizare, cererea va eșua și va genera o eroare):

 Route::view('/homepage', 'homepage', ['name' => "Kinsta"]);

Lista rutelor

Pe măsură ce aplicația dvs. crește în dimensiune, la fel va crește și numărul de solicitări care trebuie direcționate. Și cu un volum mare de informații poate veni o mare confuzie.

Aici ne poate ajuta artisan route:list command . Oferă o privire de ansamblu asupra tuturor rutelor care sunt definite în aplicație, middleware-urile și controlerele acestora.

 php artisan route:list

Va afișa o listă cu toate rutele fără middleware. Pentru aceasta, trebuie să folosim steag-ul -v :

 php artisan route:list -v

Într-o situație în care este posibil să utilizați un design bazat pe domeniu în care rutele dvs. au nume specifice în căile lor, puteți utiliza capacitățile de filtrare ale acestei comenzi astfel:

 php artisan route:list –path=api/account

Aceasta va afișa numai rutele care încep cu api/account .

Pe de altă parte, putem instrui Laravel să excludă sau să includă rute definite de terți utilizând opțiunile –except-vendor sau –only-vendor .

Parametrii rutei

Uneori, poate fi necesar să capturați segmente ale URI-ului cu ruta, cum ar fi un ID de utilizator sau un simbol. Putem face acest lucru prin definirea unui parametru de rută, care este întotdeauna încadrat în acolade ( {} ) și ar trebui să fie format numai din caractere alfabetice.

Dacă rutele noastre au dependențe în interiorul apelurilor, containerul de servicii Laravel le va injecta automat:

 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);

Parametrii necesari

Parametrii necesari ai lui Laravel sunt parametri din rute pe care nu avem voie să-i sărim atunci când facem un apel. În caz contrar, va fi generată o eroare:

 Route::post("/gdpr/{userId}", GetGdprDataController.php");

Acum în GetGdprDataController.php vom avea acces direct la parametrul $userId .

 public function __invoke(int $userId) { // Use the userId that we received… }

O rută poate lua orice număr de parametri. Sunt injectate în traseul apelurilor/controlerelor în funcție de ordinea în care sunt listate:

 // 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 opționali

Într-o situație în care dorim să facem ceva pe o rută când este prezent doar un parametru și nimic altceva, totul fără a afecta întreaga aplicație, putem adăuga un parametru opțional. Acești parametri opționali sunt notați cu ? anexat acestora:

 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); }

Wildcard traseu

Laravel ne oferă o modalitate de a filtra cum ar trebui să arate parametrii noștri opționali sau necesari.

Să presupunem că vrem un șir de ID de utilizator. Îl putem valida așa la nivelul rutei folosind metoda where .

Metoda where acceptă numele parametrului și regula regex care va fi aplicată la validare. În mod implicit, ia primul parametru, dar dacă avem mulți, putem trece o matrice cu numele parametrului ca cheie și regula ca valoare, iar Laravel le va analiza pe toate pentru 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]+');

Putem face acest lucru cu un pas mai departe și aplică validarea pe toate rutele din aplicația noastră utilizând metoda pattern de pe fațada Route :

 Route::pattern('id', '[0-9]+');

Acest lucru va valida fiecare parametru id cu această expresie regex. Și odată ce îl definim, acesta va fi aplicat automat tuturor rutelor folosind acel nume de parametru.

După cum putem vedea, Laravel folosește caracterul / ca separator în cale. Dacă vrem să-l folosim în cale, trebuie să îi permitem în mod explicit să facă parte din substituentul nostru folosind o expresie regex where .

 Route::get('/find/{query}', function ($query) { // })->where('query', , '.*');

Singurul dezavantaj este că va fi suportat doar în ultimul segment de rută.

Trasee numite

După cum sugerează și numele, putem numi rute, ceea ce face convenabil generarea de adrese URL sau redirecționarea pentru anumite rute.

Te lupți cu timpii de nefuncționare și problemele WordPress? Kinsta este soluția de găzduire concepută pentru a vă economisi timp! Verificați caracteristicile noastre

Cum se creează rute numite

O modalitate simplă de a crea o rută denumită este oferită de metoda name înlănțuită pe fațada Route . Numele fiecărei rute ar trebui să fie unic:

 Route::get('/', function () { })->name("homepage");

Grupuri de rute

Grupurile de rute vă permit să partajați atribute de rută, cum ar fi middleware-urile, pe un număr mare de rute, fără a fi nevoie să le redefiniți pe fiecare rută.

Middleware

Atribuirea unui middleware tuturor rutelor pe care le avem ne permite să le combinăm într-un grup, mai întâi folosind metoda group . Un lucru de luat în considerare este că middleware-urile sunt executate în ordinea în care sunt aplicate grupului:

 Route:middleware(['AuthMiddleware', 'SessionMiddleware'])->group(function () { Route::get('/', function() {} ); Route::post('/upload-picture', function () {} ); });

Controlorii

Când un grup utilizează același controler, putem folosi metoda controller pentru a defini controlerul comun pentru toate rutele din acel grup. Acum trebuie să specificăm metoda pe care o va apela ruta.

 Route::controller(UserController::class)->group(function () { Route::get('/orders/{userId}', 'getOrders'); Route::post('/order/{id}', 'postOrder'); });

Subdomeniu de rutare

Un nume de subdomeniu este o informație suplimentară adăugată la începutul numelui de domeniu al unui site web. Acest lucru permite site-urilor web să se separe și să își organizeze conținutul pentru funcții specifice, cum ar fi magazine online, bloguri, prezentări și așa mai departe de restul site-ului.

Rutele noastre pot fi folosite pentru a gestiona rutarea subdomeniului. Putem captura domeniul și o porțiune din subdomeniu pentru utilizare în controlerul și traseul nostru. Cu ajutorul metodei domain de pe fațada Route , putem grupa traseele noastre sub un singur domeniu:

 Route::domain('{store}.enterprise.com')->group(function() { Route::get('order/{id}', function (Account $account, string $id) { // Your Code } });

Prefixe și prefixe de nume

Ori de câte ori avem un grup de rute, în loc să le modificăm unul câte unul, putem folosi utilitățile suplimentare pe care Laravel le oferă, cum ar fi prefix și name de pe fațada Route .

Metoda prefix poate fi folosită pentru a prefix fiecare rută din grup cu un anumit URI, iar metoda name poate fi folosită pentru a prefix fiecare rută cu un șir dat.

Acest lucru ne permite să creăm lucruri noi, cum ar fi rutele de administrare, fără a fi necesar să modificăm fiecare nume sau prefix pentru a le identifica:

 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'); }); });

Acum URI-urile pentru aceste rute vor fi admin/get , admin/put , admin/post , iar numele admin.get , admin.put și admin.post .

Memorarea rutelor în cache

Când implementează aplicația pe serverele de producție, un dezvoltator bun Laravel va profita de cache-ul de rute al Laravel.

Ce este Route Caching?

Memorarea în cache a rutelor scade timpul necesar pentru înregistrarea tuturor rutelor aplicației.

Rularea php artisan route:cache este generată o instanță de Illuminate/Routing/RouteCollection , iar după ce a fost codificată, ieșirea serializată este scrisă în bootstrap/cache.routes.php .

Acum orice altă solicitare va încărca acest fișier cache dacă există. Prin urmare, aplicația noastră nu mai trebuie să analizeze și să convertească intrările din fișierul rută în obiecte Illuminate/Routing/Route în Illuminate/Routing/RouteCollection .

De ce este important să folosiți Route Caching

Nefolosind caracteristica de memorare a rutelor oferită de Laravel, aplicația dumneavoastră riscă să ruleze mai lent decât ar putea fi, ceea ce ar putea, la rândul său, să scadă vânzările, păstrarea utilizatorilor și încrederea în marca dvs.

În funcție de amploarea proiectului dvs. și de câte rute există, rularea unei comenzi simple de stocare în cache a rutei vă poate accelera aplicația cu oriunde de la 130% la 500% - un câștig masiv pentru aproape niciun efort.

rezumat

Rutarea este coloana vertebrală a dezvoltării backend. Cadrul Laravel excelează la acest lucru, oferind un mod detaliat de definire și gestionare a rutelor. Fiți confortabil cu rutarea Laravel în acest ghid amănunțit. Faceți clic pentru a trimite pe Tweet

Dezvoltarea poate fi într-adevăr accesibilă pentru toată lumea și poate ajuta la accelerarea unei aplicații doar în virtutea faptului că este construită în Laravel.

Ce alte trucuri și sfaturi ați mai întâlnit cu privire la traseele Laravel? Anunțați-ne în secțiunea de comentarii!