Jak na routy

Routování, česky bychom to mohli velmi volně pojmenovat jako překládání URL cest, je jedním ze základních konceptů Laravel frameworku a jedná se o velmi flexibilní systém. V tomto článku si na praktickém příkladě vysvětlíme různé možnosti, jak routy můžeme využít.

Od verze 5.5. jsou routy defaultně v adresáři /routes , kde cesty pro webovou aplikaci jsou v souboru web.php  a cesty pro API jsou v api.php .

Když si otevřete routes/web.php , najdete v něm tento kód:

Prakticky je již definovaná routa pro domácí stránku. Tedy kdykoliv tato routa získá požadavek vykreslit cestu "/", vrátí se pohled welcome.blade.php , nacházející se v resources/views.

Struktura definice rout je poměrně jednoduchá. V požadovaném souboru (web.php  nebo api.php ) začněte zavoláním statické třídy Route:: (což je alias pro fasádu Illuminate\Support\Facades\Route) a poté následuje požadavek, který chcete přiřadit ke konkrétní routě. Dále následuje funkce, která vykoná výsledek po zpracování routy. Router, který je zodpovědný za zpracování, umožňuje registrovat routy reagující na jakýkoliv HTTP požadavek:

Když bychom si to měli převést na náš blog, pak jakmile uživatelé zadají naši stránku www.blog.cz, automaticky se zavolá routa "/", která vykreslí domovskou stránku (pohled welcome). Stejný způsob lze využít, pokud bychom je chtěli odkázat například na stránku "O mě". V tom případě bychom routu definovali v souboru web.php takto:

Adresa samozřejmě nebude fungovat a vyhodí se výjimka, protože neexistuje pohled aboutme.blade.php.

Požadavek typu POST se nejčastěji využívá ve formuláři, kdy potřebujeme vytvořit nový záznam, například nový článek. PUT/PATCH pak pro editaci a DELETE pro smazání záznamu. Typ OPTIONS se používá jen ve velmi vzácných případech a pro tento článek není potřeba ho nijak vysvětlovat.

Pro kontrolu a informacích ohledně rout je nejlepší artisan příkaz route:list, který vám vygeneruje všechny routy a informace o nich:

Prvně je název controlleru (namespace se předpokládá App\Http\Controllers) a za zavináčem následuje název metody, která se má v controlleru zavolat. V tomto případě se tedy zavolá třída AboutMeController  a metoda index() .

Parametr se vkládá mezi složené závorky a do callbacku předáváme parametry, které jsme v routě použili. Název parametrů v callbacku může být jakýkoliv a nemusí být shodný s názvem parametru v routě, Laravel automaticky pozná o jaký parametr se jedná na základě pořadí. Úplně stejný způsob lze využít, pokud bychom potřebovali více parametrů. Potřebujeme například vygenerovat cestu category/tutorials/article/my-first-article, kde tutorials je název kategorie a my-first-article je název článku. To lze snadno udělat takto:

Podobný způsob lze použít s controllery, kde do metody jako parametry použijeme parametry z routy:

Nepovinný parametr funguje stejně jako povinný parametr a také vkládá mezi složené závorky, důležitým rozdílem je ale otazník na konci parametru. Druhý parametr je callback, kde za parametr vkládáme výchozí hodnotu, pokud jsme nevyužili parametr. V tomto případě pokud jsme nevložili název kategorie tak zobrazíme text s všemi kategoriemi. Můžeme ale zde použít jakoukoliv výchozí hodnotu, například výchozí kategorii.

Při zpracování této URL cesty se Laravel prvně podívá, jestli existuje parametr ID. Pokud ne, pak automaticky zobrazí text s výchozím ID 1. Pokud existuje, pak se zavolá metoda where() , která zkontroluje parametr id podle regulárního výrazu a pokud je výsledek false, pak uživatelovi vyhodí výjimku NotFoundHttpException , která se vyhodnotí jako chyba 404. V opačném případě vše v pořádku projde.

Když pak potřebujeme vygenerovat URL pro tuto cestu, stačí využít helper route():

Stejně tak toho můžeme využít například při přesměrování:

Pokud bychom měli v routě definované parametry, pak do pomocné metody route()  přidáme druhý parametr, kde se hodnoty automaticky vloží na správné místo:

Všimněte si, že v metodě name()  ve skupině je "admin." i s tečkou. Pro vygenerování URL pak můžeme použít routy s názvem admin.category  nebo admin.article .

Protože proměnná $article  má type-hind Eloquent modelu App\Article  a název proměnné je stejný jako jako v URL části {article} , Laravel automaticky vloží instanci modelu, kde se ID shoduje s parametrem z URL cesty. Pokud by se žádná instance modelu nenašla, pak se vrátí odpověď typu 404. Laravel automaticky předpokládá, že má vyhledávat záznam podle sloupce, který má název id. Problém vzniká, když bychom chtěli model navázat na routu, ale parametr není ID, ale třeba název článku (respektive její slug, tedy název zformátován do správné URL podoby), například article/my-first-article . V tom případě musíme v požadovaném modelu, v tomto případě App\Article , přepsat metodu getRouteKeyName() :

Pokud bychom použili stejnou definici routy, ale namísto ID vložit slug článku, pak proces bude probíhat stejně. Tedy Laravel se pokusí najít instanci modelu Article, kde parametr odpovídá záznamu ve sloupci slug.

Pokud použijeme parametr /article/55 , pak se načte první routa. Nicméně i když žádný parametr nevložíme /article/ , stále se použije první routa. Je to proto, že první routa splňuje podmínky pro obě routy a tedy se žádná další routa nevykoná. Toto je potřeba mít na paměti a vytvářet routy tak, aby se náhodou nevykonala jiná, která je pro nás nežádoucí.

Přípomínky či dotazy? Pište do komentářů!