Opanowanie tras Laravel
Opublikowany: 2022-12-12Jeśli chodzi o zaplecze, programiści w końcu napotykają trasy. Trasy można uznać za szkielet zaplecza, ponieważ każde żądanie otrzymywane przez serwer jest przekierowywane do kontrolera za pośrednictwem listy tras, która odwzorowuje żądania na kontrolery lub akcje.
Laravel ukrywa dla nas wiele szczegółów implementacji i zawiera dużo cukru składniowego, aby pomóc zarówno nowym, jak i doświadczonym programistom rozwijać ich aplikacje internetowe.
Przyjrzyjmy się bliżej, jak zarządzać trasami w Laravel.
Backend Routing i Cross-Site Scripting w Laravel
Na serwerze istnieją zarówno trasy publiczne, jak i prywatne. Trasy publiczne mogą być powodem do niepokoju ze względu na możliwość cross-site scripting (XSS), rodzaj ataku iniekcyjnego, który może narazić Ciebie i Twoich użytkowników na złośliwe ataki.
Problem polega na tym, że użytkownik może zostać przekierowany z trasy, która nie wymaga tokena sesji, na taką, która go wymaga — i nadal będzie miał dostęp bez tokena.
Najprostszym sposobem rozwiązania tego problemu jest wymuszenie nowego nagłówka HTTP, dodając „referrer” do trasy, aby złagodzić ten scenariusz:
'main' => [ 'path' => '/main', 'referrer' => 'required,refresh-empty', 'target' => Controller\DashboardController::class . '::mainAction' ]
Podstawowy routing Laravela
W Laravel trasy umożliwiają użytkownikom skierowanie odpowiedniego żądania do żądanego kontrolera. Najbardziej podstawowa trasa Laravel akceptuje Uniform Asset Identifier (ścieżkę trasy) oraz zamknięcie, które może być zarówno funkcją, jak i klasą.
W Laravel trasy są tworzone w plikach web.php i api.php . Laravel ma domyślnie dwie trasy: jedną dla SIECI i jedną dla API.
Te trasy znajdują się w folderze tras/ , ale są ładowane w Providers/RouteServiceProvider.php .
Zamiast tego możemy załadować trasy bezpośrednio do RouteServiceProvider.php , całkowicie pomijając folder tras/ .
Przekierowania
Kiedy definiujemy trasę, zwykle chcemy przekierować użytkownika, który uzyskuje do niej dostęp, a przyczyny tego są bardzo różne. Może to być spowodowane tym, że jest to przestarzała trasa i zmieniliśmy zaplecze lub serwer, lub dlatego, że chcemy zainstalować uwierzytelnianie dwuskładnikowe (2FA) i tak dalej.
Laravel ma na to prosty sposób. Dzięki prostocie frameworka możemy zastosować metodę przekierowania na fasadzie Route, która akceptuje trasę wejściową oraz trasę, na którą ma nastąpić przekierowanie.
Opcjonalnie jako trzeci parametr możemy podać kod statusu przekierowania. Metoda permanentRedirect
zrobi to samo, co metoda redirect
, z tą różnicą, że zawsze zwróci kod statusu 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");
Wewnątrz tras przekierowań zabronione jest używanie słów kluczowych „destination” i „status” jako parametrów, ponieważ są one zarezerwowane przez Laravel.
// Illegal to use Route::redirect("/home", "/office/{status}");
Wyświetlenia
Widoki są. blade.php , których używamy do renderowania frontendu naszej aplikacji Laravel. Wykorzystuje silnik szablonów blade i jest domyślnym sposobem na zbudowanie aplikacji z pełnym stosem przy użyciu tylko Laravel.
Jeśli chcemy, aby nasza trasa zwracała widok, możemy po prostu użyć metody view na fasadzie trasy. Akceptuje parametr trasy, nazwę widoku i opcjonalną tablicę wartości, które mają zostać przekazane do widoku.
// When the user accesses my-domain.com/homepage // the homepage.blade.php file will be rendered Route::view("/homepage", "homepage");
Załóżmy, że nasz widok chce powiedzieć „Cześć, {name}
”, przekazując opcjonalną tablicę z tym parametrem. Możemy to zrobić za pomocą następującego kodu (jeśli brakujący parametr jest wymagany w widoku, żądanie zakończy się niepowodzeniem i zgłosi błąd):
Route::view('/homepage', 'homepage', ['name' => "Kinsta"]);
Lista tras
Wraz ze wzrostem rozmiaru aplikacji rośnie liczba żądań, które należy skierować. A przy dużej ilości informacji może pojawić się wielkie zamieszanie.
Tutaj może nam pomóc artisan route:list command
. Zawiera przegląd wszystkich tras zdefiniowanych w aplikacji, ich oprogramowania pośredniczącego i kontrolerów.
php artisan route:list
Wyświetli listę wszystkich tras bez oprogramowania pośredniego. W tym celu musimy użyć flagi -v
:
php artisan route:list -v
W sytuacji, gdy możesz używać projektowania opartego na domenach, w którym twoje trasy mają określone nazwy w swoich ścieżkach, możesz skorzystać z możliwości filtrowania tego polecenia w następujący sposób:
php artisan route:list –path=api/account
Spowoduje to wyświetlenie tylko tras rozpoczynających się od api/account .
Z drugiej strony możemy poinstruować Laravel, aby wykluczał lub uwzględniał trasy zdefiniowane przez strony trzecie, używając opcji –except-vendor
lub –only-vendor
.
Parametry trasy
Czasami może być konieczne przechwycenie segmentów identyfikatora URI wraz z trasą, takich jak identyfikator użytkownika lub token. Możemy to zrobić, definiując parametr trasy, który zawsze jest ujęty w nawiasy klamrowe ( {}
) i powinien składać się wyłącznie ze znaków alfabetu.
Jeśli nasze trasy mają zależności w swoich wywołaniach zwrotnych, kontener usługi Laravel automatycznie je wstrzyknie:
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);
Wymagane parametry
Wymagane parametry Laravela to parametry w trasach, których nie możemy pominąć podczas wykonywania połączenia. W przeciwnym razie zostanie wyrzucony błąd:
Route::post("/gdpr/{userId}", GetGdprDataController.php");
Teraz w GetGdprDataController.php będziemy mieli bezpośredni dostęp do parametru $userId .
public function __invoke(int $userId) { // Use the userId that we received… }
Trasa może przyjmować dowolną liczbę parametrów. Są one wstrzykiwane do wywołań zwrotnych/kontrolerów trasy na podstawie kolejności, w jakiej są wymienione:
// api.php Route::post('/gdpr/{userId}/{userName}/{userAge}', GetGdprDataController.php); // GetGdprDataController.php public function __invoke(int $userId, string $userName, int $userAge) { // Use the parameters… }
Parametry opcjonalne
W sytuacji, gdy chcemy coś zrobić na trasie, gdy obecny jest tylko parametr i nic więcej, a wszystko to bez wpływu na całą aplikację, możemy dodać opcjonalny parametr. Te opcjonalne parametry są oznaczone ?
dołączone do nich:
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); }
Dzika karta trasy
Laravel umożliwia nam filtrowanie tego, jak powinny wyglądać nasze opcjonalne lub wymagane parametry.
Powiedzmy, że chcemy ciąg identyfikatora użytkownika. Możemy to w ten sposób zweryfikować na poziomie trasy za pomocą metody where
.
Metoda where
akceptuje nazwę parametru i regułę wyrażenia regularnego, która zostanie zastosowana podczas sprawdzania poprawności. Domyślnie przyjmuje pierwszy parametr, ale jeśli mamy ich wiele, możemy przekazać tablicę z nazwą parametru jako kluczem i regułą jako wartością, a Laravel przeanalizuje je wszystkie za nas:
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]+');
Możemy pójść o krok dalej i zastosować walidację na wszystkich trasach w naszej aplikacji, używając metody pattern
na fasadzie Route
:
Route::pattern('id', '[0-9]+');
Spowoduje to sprawdzenie poprawności każdego parametru id
z tym wyrażeniem regularnym. A kiedy go zdefiniujemy, zostanie on automatycznie zastosowany do wszystkich tras korzystających z tej nazwy parametru.
Jak widać, Laravel używa znaku /
jako separatora w ścieżce. Jeśli chcemy użyć go w ścieżce, musimy jawnie zezwolić, aby był częścią naszego symbolu zastępczego, używając wyrażenia regularnego where
.
Route::get('/find/{query}', function ($query) { // })->where('query', , '.*');
Jedynym minusem jest to, że będzie obsługiwany tylko w ostatnim segmencie trasy.
Trasy nazwane
Jak sama nazwa wskazuje, możemy nazywać trasy, co ułatwia generowanie adresów URL lub przekierowanie na określone trasy.
Jak tworzyć nazwane trasy
Prostym sposobem na utworzenie nazwanej trasy jest metoda name
połączona na fasadzie Route
. Nazwa każdej trasy powinna być niepowtarzalna:
Route::get('/', function () { })->name("homepage");
Grupy tras
Grupy tras umożliwiają udostępnianie atrybutów tras, takich jak oprogramowanie pośrednie, w dużej liczbie tras bez konieczności ponownego definiowania ich na każdej trasie.
Oprogramowanie pośrednie
Przypisanie oprogramowania pośredniczącego do wszystkich tras, które mamy, pozwala nam połączyć je w grupę, najpierw za pomocą metody group
. Jedną rzeczą do rozważenia jest to, że oprogramowanie pośrednie jest uruchamiane w kolejności, w jakiej są stosowane w grupie:
Route:middleware(['AuthMiddleware', 'SessionMiddleware'])->group(function () { Route::get('/', function() {} ); Route::post('/upload-picture', function () {} ); });
Kontrolery
Gdy grupa korzysta z tego samego kontrolera, możemy użyć metody controller
do zdefiniowania wspólnego kontrolera dla wszystkich tras w tej grupie. Teraz musimy określić metodę, którą wywoła trasa.
Route::controller(UserController::class)->group(function () { Route::get('/orders/{userId}', 'getOrders'); Route::post('/order/{id}', 'postOrder'); });
Routing subdomeny
Nazwa subdomeny to dodatkowa informacja dodawana na początku nazwy domeny strony internetowej. Pozwala to stronom internetowym oddzielić i uporządkować ich zawartość pod kątem określonych funkcji, takich jak sklepy internetowe, blogi, prezentacje itd., od reszty witryny.
Nasze trasy mogą być używane do obsługi routingu subdomen. Możemy przechwycić domenę i część subdomeny do wykorzystania w naszym kontrolerze i trasie. Za pomocą metody domain
na fasadzie Route
możemy zgrupować nasze trasy w jednej domenie:
Route::domain('{store}.enterprise.com')->group(function() { Route::get('order/{id}', function (Account $account, string $id) { // Your Code } });
Prefiksy i prefiksy nazw
Zawsze, gdy mamy grupę tras, zamiast modyfikować je jedna po drugiej, możemy skorzystać z dodatkowych narzędzi, które zapewnia Laravel, takich jak prefix
i name
na elewacji Route
.
Metody prefix
można użyć do poprzedzenia każdej trasy w grupie danym identyfikatorem URI, a metody name
można użyć do poprzedzenia każdej nazwy trasy podanym ciągiem.
Dzięki temu możemy tworzyć nowe rzeczy, takie jak trasy administratora, bez konieczności modyfikowania każdej nazwy lub prefiksu w celu ich identyfikacji:
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'); }); });
Teraz identyfikatory URI dla tych tras będą miały postać admin/get
, admin/put
, admin/post
, a nazwy admin.get
, admin.put
i admin.post
.
Buforowanie tras
Wdrażając aplikację na serwery produkcyjne, dobry programista Laravela skorzysta z pamięci podręcznej tras Laravela.
Co to jest buforowanie tras?
Buforowanie tras skraca czas potrzebny do zarejestrowania wszystkich tras aplikacji.
Uruchamianie php artisan route:cache
generowana jest instancja Illuminate/Routing/RouteCollection
, a po zakodowaniu serializowane dane wyjściowe są zapisywane do bootstrap/cache.routes.php
.
Teraz każde inne żądanie załaduje ten plik pamięci podręcznej, jeśli istnieje. Dlatego nasza aplikacja nie musi już parsować i konwertować wpisów z pliku tras na obiekty Illuminate/Routing/Route
w Illuminate/Routing/RouteCollection
.
Dlaczego ważne jest, aby korzystać z buforowania tras
Nie korzystając z funkcji buforowania tras, którą zapewnia Laravel, Twoja aplikacja może działać wolniej niż mogłaby, co z kolei może zmniejszyć sprzedaż, utrzymanie użytkowników i zaufanie do Twojej marki.
W zależności od skali projektu i liczby tras uruchomienie prostego polecenia buforowania tras może przyspieszyć działanie aplikacji o dowolne miejsce od 130% do 500% — ogromny zysk przy prawie zerowym wysiłku.
Streszczenie
Routing jest podstawą rozwoju backendu. Framework Laravel wyróżnia się w tym, zapewniając szczegółowy sposób definiowania tras i zarządzania nimi.
Programowanie może rzeczywiście być dostępne dla wszystkich i pomóc przyspieszyć aplikację tylko dzięki temu, że jest zbudowana w Laravel.
Jakie inne sztuczki i wskazówki napotkałeś w odniesieniu do tras Laravel? Daj nam znać w sekcji komentarzy!