Laravel Routing - útvonalválasztás (3. rész)

Attila | 2022. 02. 17. 14:03 | Olvasási idő: 2 perc

Címkék: #Blade #Laravel #MVC #Nézet (View) #Routing

Azt már megtapasztaltuk, hogy az útvonalak összeállításánál nagy szabadságunk van, képesek vagyunk mindenfélét definiálni és regisztrálni. Sokszor azonban olyan útvonalra van szükség, ami nincsen már a legelején "kőbe vésve", hanem enged egy kis szabadságot nekünk. Ezek lesznek a joker vagy wildcard útvonalak.
Wildcard routes

A wildcard útvonalak akkor lehetnek még nagyon hasznosak, ha például van egy blogom, mint ami most van is, és a blogbejegyzéseknek szeretnék egy adott útvonal struktúrát meghatározni, de mindegyiknek ugyanazt. Például a "/posts/" fő útvonal után szeretném a bejegyzések címeit betenni az útvonalba, de nem szeretném őket mind egyesével, egyedileg regisztrálni. Ekkor használhatok wildcard-ot (vagy joker útvonalat). Az útvonal, amit regisztrálok a web.php -ben akkor így nézhet ki: "/posts/{post}"

Route::get('/posts/{post}', function () {
  return view('post');
});


Tehát kapcsos zárójelek közé teszem a wildcard-ot és így minden olyan útvonalra illeszkedni fog ez, ami így kezdődik, például ezekre:

Persze most még betöltődni nem fognak, hiszen hiányzik a nézet fájl hozzá, ezért hozzuk létre a resources/views/post.blade.php -t és adjuk meg a tartalmát egyelőre statikusan:

<h1>My blog<h1>

Most már működni fognak a fenti linkek. Most már kibővíthetjük ezt a példát is azzal, hogy adatot adunk át a nézetnek. Ehhez módosítsuk az útvonalunkat egy paraméterátadással a function-ben és először térjünk is vissza vele.

Route::get('/posts/{post}', function ($post) {
  return $post;
});

A fenti weblink bármelyikének újratöltésével már látszódik is az eredmény: amit a wildcard helyére írtunk, az jelenik meg a paraméterül átadott változóban értékként.

Közelítsünk most egy valós életbeli megoldás felé (vagy legalábbis szimuláljuk), amikor például adatbázisból nyerem ki a post-okat és az adott azonosítójút (id) szeretném átadni a nézetnek, majd megmutatni azt a felhasználónak:

Route::get('/posts/{post}', function ($post) {
  $posts = [
    'my-first-post' => 'Hello, this is my first blog post!',
    'my-second-post' => 'Now I am getting the hang of this blogging thing'
  ];
  return view('post', [ 
    'post' => $posts[$post]
  ]);
});

Ehhez a még az kell, hogy a post nézetünket is bővítsük egy Blade-es kiíratással:

<p>{{ $post }}</p>

Teszteljük, de ügyeljünk arra, hogy most már nem írhatunk bármit az URL végére! Ezek a lehetséges és működő címek:

Ha mást írok be az utolsó helyre, akkor nem fog működni, hiszen a $posts tömbnek nincs más index nevű eleme. Ezt orvosolhatjuk egy kicsit felhasználóbarátabb módon:

return view('post', [
  'post' => $posts[$post] ?? 'Nothing here yet.'
]);

Mejegyzés: a ?? operátor a PHP-ben azt jelenti, hogy ha létezik az előtte lévő elem, akkor rendben van és azt használja, ha nem létezik (vagy null), akkor a ?? utáni értéket adja vissza.

De megcsinálhatjuk így is az iménti helyett ezt beírva a return elé:

if ( ! array_key_exists($post, $posts)) {
  abort(404);
}

Az abort metódussal tudjuk megszakítani az oldalunk működését abban az esetben, ha nincs a $posts tömbnek $post eleme.

A metódus paraméterében tudjuk definiálni a HTTP állapotkódot, jelen esetben hibakódot, amit egy korábbi bejegyzésemben már említettem. Amúgy arra is van lehetőségünk, hogy felüldefiniáljuk a leggyakrabban előforduló hibakódokhoz tartozó nézeteinket a következő utasítás segítségével:

php artisan vendor:publish --tag=laravel-errors

Ennek hatására a resources/views mappában létrejön egy errors mappa, amibe bekerülnek 401, 402, 403, 404, 500 stb. hibakódokat tartalmazó nézetek, amelyeket szabadon módosíthatunk és ha a felhasználó ilyen hibakódokat kapna, akkor a mi általunk felüldefiniált nézetek jelennek meg a számukra. (Bővebben erről itt olvashat: https://laravel.com/docs/9.x/errors#http-exceptions)

Így például a resources/views/errors/404.blade.php -ben módosíthatjuk a "message"-ben lévő "Sorry" üzenetet bármi másra, például ilyenre:

Ne feledjétek, az alkalmazás fejlődésének nyomon követését a Github-on is megtehetitek itt: https://github.com/gludovatza/myfirstsite A friss módosítások ennek a commit-nek lettek a részei: Routing 3. rész