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