Opanowanie tras Laravel

Opublikowany: 2022-12-12

Jeś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. Kliknij, aby tweetować

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 .

Linia poleceń pokazująca domyślny stan dostawcy usług trasy Laravela.
Domyślny stan dostawcy usług tras Laravela.

Zamiast tego możemy załadować trasy bezpośrednio do RouteServiceProvider.php , całkowicie pomijając folder tras/ .

Okno wiersza poleceń pokazujące ładowanie tras Laravel bezpośrednio w dostawcy.
Ładowanie tras Laravel bezpośrednio w dostawcy.

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.

Zmagasz się z przestojami i problemami z WordPressem? Kinsta to rozwiązanie hostingowe zaprojektowane, aby zaoszczędzić Twój czas! Sprawdź nasze funkcje

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. Zapoznaj się z routingiem Laravel w tym szczegółowym przewodniku Kliknij, aby tweetować

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!