Når det kommer til backend, støder udviklerne i sidste ende på ruter. Ruter kan betragtes som backendens rygrad, da alle anmodninger, som serveren modtager, omdirigeres til en controller via en ruteliste, der kortlægger anmodninger til controllere eller handlinger.

Laravel skjuler mange implementeringsdetaljer for os og leveres med en masse syntaktisk sukker, der hjælper både nye og erfarne udviklere med at udvikle deres webapplikationer.

Lad os se nærmere på, hvordan man håndterer ruter i Laravel.

Backend-routing og Cross-Site Scripting i Laravel

På en server findes der både offentlige og private ruter. Offentlige ruter kan give anledning til bekymring på grund af muligheden for cross-site scripting (XSS), en type injektionsangreb, der kan gøre dig og dine brugere sårbare over for ondsindede aktører.

Problemet er, at en bruger kan blive omdirigeret fra en rute, der ikke kræver et sessionstoken, til en rute, der kræver et sessionstoken – og de vil stadig have adgang uden tokenet.

Den enkleste måde at løse dette problem på er at håndhæve en ny HTTP-header og tilføje “referrer” til ruten for at afbøde dette scenario:

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

Laravel Basic Routing

I Laravel giver ruter brugerne mulighed for at videresende den relevante anmodning til den ønskede controller. Den mest grundlæggende Laravel-rute accepterer en Uniform Asset Identifier (din route path) og en lukning, som både kan være en funktion eller en klasse.

I Laravel oprettes ruter inde i filerne web.php og api.php. Laravel leveres som standard med to ruter: en til WEB og en til API.

Disse ruter befinder sig i mappen routes/, men de indlæses i Providers/RouteServiceProvider.php.

En kommandolinje, der viser standardtilstanden for Laravels route service provider.
Standardtilstand for Laravels route service provider.

I stedet for at gøre dette kan vi indlæse ruterne direkte inde i RouteServiceProvider.php og springe routes/-mappen helt over.

Et kommandolinjevindue, der viser indlæsningen af Laravel-ruter direkte i udbyderen.
Indlæsning af Laravel-ruter direkte i udbyderen.

Omdirigerer

Når vi definerer en rute, vil vi normalt ønske at omdirigere den bruger, der tilgår den, og grundene til dette varierer meget. Det kan være fordi det er en deprecated route, og vi har ændret backend eller serveren, eller det kan være fordi vi ønsker at installere to-faktor-autentifikation (2FA) osv.

Laravel har en nem måde at gøre dette på. Takket være frameworkets enkelhed kan vi bruge redirect-metoden på Route-facaden, som accepterer indgangsruten og den rute, der skal omdirigeres til.

Valgfrit kan vi angive statuskoden for redirectet som den tredje parameter. Metoden permanentRedirect vil gøre det samme som metoden redirect, bortset fra at den altid returnerer en 301-statuskode:

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

Inde i redirect-ruterne er det forbudt at bruge nøgleordene “destination” og “status” som parametre, da de er reserveret af Laravel.

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

Visninger

Views er de .blade.php-filer, som vi bruger til at gengive frontend-delen af vores Laravel-applikation. Det bruger blade templating engine, og det er standardmetoden til at bygge en full-stack applikation udelukkende med Laravel.

Hvis vi ønsker, at vores rute skal returnere en visning, kan vi blot bruge view-metoden på Route-facaden. Den accepterer en ruteparameter, et visningsnavn og et valgfrit array af værdier, der skal overføres til visningen.

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

Lad os antage, at vores visning ønsker at sige “Hello, {name}” ved at videregive et valgfrit array med denne parameter. Vi kan gøre netop dette med følgende kode (hvis den manglende parameter er påkrævet i visningen, vil anmodningen mislykkes og kaste en fejl):

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

Route List

Efterhånden som din applikation vokser i størrelse, vil antallet af anmodninger, der skal dirigeres, også vokse. Og med en stor mængde information kan der opstå stor forvirring.

Det er her, at artisan route:list command kan hjælpe os. Den giver et overblik over alle de ruter, der er defineret i applikationen, deres middlewares og controllere.

php artisan route:list

Den vil vise en liste over alle ruter uden middlewares. Til dette skal vi bruge flaget -v:

php artisan route:list -v

I en situation, hvor du måske bruger domænedrevet design, hvor dine ruter har specifikke navne i deres stier, kan du gøre brug af filtreringsmulighederne i denne kommando på følgende måde:

php artisan route:list –path=api/account

Dette vil kun vise de ruter, der starter med api/account.

På den anden side kan vi instruere Laravel om at udelukke eller inkludere tredjepartsdefinerede ruter ved at bruge indstillingerne –except-vendor eller –only-vendor.

Ruteparametre

Nogle gange kan du have brug for at fange segmenter af URI’en med ruten, som f.eks. et bruger-id eller token. Det kan vi gøre ved at definere en ruteparameter, som altid er omsluttet af parenteser ({}) og kun bør bestå af alfabetiske tegn.

Hvis vores ruter har afhængigheder inden for deres callbacks, vil Laravel-tjenestecontaineren automatisk injicere dem:

use IlluminateHttpRequest;
use Controllers/DashboardController;
Route::post('/dashboard/{id}, function (Request $request, string $id) {
  return 'User:' . $id;
}
Route::get('/dashboard/{id}, DashboardController.php);

Krævede parametre

Laravels obligatoriske parametre er parametre i ruter, som vi ikke må springe over, når vi foretager et kald. Ellers vil der blive kastet en fejl:

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

Nu inde i GetGdprDataController.php får vi direkte adgang til parameteren $userId.

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

En rute kan tage et vilkårligt antal parametre. De injiceres i rute callbacks/controllere baseret på den rækkefølge, de er opført i:

 // api.php
Route::post('/gdpr/{userId}/{userName}/{userAge}', GetGdprDataController.php);
// GetGdprDataController.php
public function __invoke(int $userId, string $userName, int $userAge) {
  // Use the parameters…
}

Valgfrie parametre

I en situation, hvor vi ønsker at gøre noget på en rute, når kun en parameter er til stede og intet andet, uden at det påvirker hele programmet, kan vi tilføje en valgfri parameter. Disse valgfrie parametre angives ved at tilføje ? til dem:

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

Route Wildcard

Laravel giver os mulighed for at filtrere, hvordan vores valgfrie eller obligatoriske parametre skal se ud.

Lad os sige, at vi vil have en streng af et bruger-id. Vi kan validere det på denne måde på ruteniveau ved hjælp af metoden where.

Metoden where accepterer navnet på parameteren og den regex-regel, der skal anvendes på valideringen. Som standard tager den den første parameter, men hvis vi har mange, kan vi sende et array med navnet på parameteren som nøgle og reglen som værdi, og Laravel vil analysere dem alle for os:

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' => '[a-z][A-z]+');

Vi kan tage dette et skridt videre og anvende validering på alle ruter i vores applikation ved at bruge metoden patternRoute facaden:

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

Dette vil validere hver id parameter med dette regex-udtryk. Og når vi først har defineret det, vil det automatisk blive anvendt på alle ruter, der bruger det pågældende parameternavn.

Som vi kan se, bruger Laravel / -tegnet som separator i stien. Hvis vi ønsker at bruge det i stien, skal vi eksplicit tillade, at det er en del af vores placeholder ved hjælp af et where regex.

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

Den eneste ulempe er, at det kun vil blive understøttet i det sidste rutesegment.

Navngivne ruter

Som navnet antyder, kan vi navngive ruter, hvilket gør det praktisk at generere URL’er eller omdirigere til specifikke routes.

Sådan opretter du navngivne ruter

En enkel måde at oprette en navngiven rute på er den metode name, der er kædet sammen med Route -facaden. Hver route’s navn skal være unikt:

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

Route grupper

Rutegrupper giver dig mulighed for at dele ruteattributter som middlewares på tværs af et stort antal routes uden at skulle omdefinere det på hver enkelt route.

Middleware

Ved at tildele en middleware til alle de ruter, vi har, kan vi kombinere dem i en gruppe, først ved at bruge metoden group. En ting, man skal være opmærksom på, er, at middlewares udføres i den rækkefølge, som de anvendes i gruppen:

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

Controllers

Når en gruppe anvender den samme controller, kan vi bruge metoden controller til at definere den fælles controller for alle ruterne i gruppen. Nu skal vi angive den metode, som en route skal kalde.

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

Routing af underdomæner

Et underdomænenavn er et stykke ekstra information, der tilføjes i begyndelsen af et websteds domænenavn. Dette giver websteder mulighed for at adskille og organisere deres indhold til specifikke funktioner, f.eks. onlinebutikker, blogs, præsentationer osv. fra resten af webstedet.

Vores ruter kan bruges til at håndtere routing af underdomæner. Vi kan fange domænet og en del af underdomænet til brug i vores controller og rute. Ved hjælp af domain -metoden på Route -facaden kan vi gruppere vores ruter under et enkelt domæne:

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

Præfikser og navnepræfikser

Når vi har en gruppe af ruter, kan vi i stedet for at ændre dem en efter en gøre brug af de ekstra hjælpeprogrammer, som Laravel tilbyder, såsom prefix og nameRoute -facaden.

Metoden prefix kan bruges til at præfiksere hver rute i gruppen med en given URI, og metoden name kan bruges til at præfiksere hvert rutenavn med en given streng.

Dette giver os mulighed for at oprette nye ting som f.eks. adminruter uden at skulle ændre hvert enkelt navn eller præfiks for at identificere dem:

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

Nu vil URI’erne for disse routes være admin/get, admin/put, admin/post, og navnene admin.get, admin.put og admin.post.

Caching af routes

Når applikationen implementeres til produktionsservere, vil en god Laravel-udvikler udnytte Laravels route cache.

Hvad er Route Caching?

Rutecaching mindsker den tid, det tager at registrere alle applikationsroutes.

Ved at køre php artisan route:cache genereres en instans af Illuminate/Routing/RouteCollection, og efter at være blevet kodet, skrives det serialiserede output til bootstrap/cache.routes.php.

Nu vil enhver anden anmodning indlæse denne cache-fil, hvis den findes. Vores applikation behøver derfor ikke længere at analysere og konvertere poster fra rutefilen til Illuminate/Routing/Route -objekter i Illuminate/Routing/RouteCollection.

Hvorfor det er vigtigt at bruge Route Caching

Ved ikke at bruge den route caching-funktion, som Laravel tilbyder, risikerer din applikation at køre langsommere, end den kunne, hvilket igen kan mindske salget, brugerfastholdelsen og tilliden til dit brand.

Afhængigt af dit projekts størrelse og hvor mange ruter der er, kan en simpel route caching-kommando gøre din applikation hurtigere med alt fra 130% til 500% – en massiv gevinst for næsten ingen indsats.

Opsummering

Routing er rygraden i backend-udvikling. Laravel-framework excellerer i dette ved at give en verbose måde at definere og administrere ruter på.

Udvikling kan faktisk være tilgængelig for alle og bidrage til at fremskynde en applikation alene i kraft af at den er bygget i Laravel.

Hvilke andre tricks og tips er du stødt på vedrørende Laravel-routes? Lad os vide det i kommentarfeltet!

Coman Cosmin

Cosmin Coman er en teknologiskribent- og udvikler med over 3 års erfaring. Udover at skrive for Kinsta, har han assisteret i forskning på nuklearfysiske faciliteter og universiteter. Han er teknisk kyndig og integreret i fællesskabet og kommer altid med innovative løsninger.