Adresa bez lomítka na konci
- pmg
- Člen | 372
Zdravím vás,
vezměme si tento oblíbený příklad routy:
$router[] = new Route('<presenter>/<action>/<id>', array(
'presenter' => 'Article',
'action' => 'show',
'id' => NULL,
));
Zdá se mi trochu nekonzistentní, že pokud id neuvedeme, adresa bude končit lomítkem, zatímco v opačném případě ne. Náprava je snadná, pokud chceme mít lomítko všude. Dá se ale nějak koncové lomítko odstranit?
A která varianta je podle vás lepší?
- David Grudl
- Nette Core | 8218
Konzistence není v tom, jestli adresa končí nebo nekončí lomítkem, ale
v tom, že se <action>
chová jako adresář, kdežto
<id>
jako soubor. Cool-URI imitují filesystém.
- pmg
- Člen | 372
Konzistence není v tom, jestli adresa končí nebo nekončí lomítkem, ale v tom, že se <action> chová jako adresář, kdežto <id> jako soubor.
Chápu, že se to tak chápe. Když ale id nezadám, můžu se také chtít odkazovat na nějaké obecné zobrazení (na soubor), ne na výchozí položku podadresáře.
/article/show
– zobrazí seznam posledních článků./article/show/
– zobrazí poslední článek, jako/article/show/default
.
Možná to není nejvhodnější příklad, ale pro ilustraci je to snad dostatečné. V prvním případě beru view jako soubor, přestože to jindy může znamenat spíš adresář a lomítko značí, že je tam nějaká nepovinná část. Samozřejmě je možné pro tu první variantu udělat zvláštní routu, ale tomu bych se právě chtěl vyhnout.
- David Grudl
- Nette Core | 8218
pmg napsal(a):
/article/show
– zobrazí seznam posledních článků./article/show/
– zobrazí poslední článek, jako/article/show/default
.
To by vážne nedělalo dobrotu. Zmátlo by to nejen uživatele, ale také (především?) vyhledávače a jde to proti RFC doporučením.
- pmg
- Člen | 372
Souhlasím, že by to bylo matoucí. I já jsem občas matoucí. Nemyslím, že bych používal obě uvedené varianty najednou, chtěl jsem jenom ukázat, že z hlediska toho chápání může být požadováno, aby varianta bez volitelného parametru neobsahovala na konci lomítko. Zkusím lepší příklad.
/article/prvni-clanek
– bez lomítka na konci, jako na La Trine./article/prvni-clanek/comments
– najednou je článek adresářem.
Oboje to může směřovat na stejný presenter, ale pokud je view výchozí, nezobrazí se před ním lomítko. Nevím, jak bych to popsal stejnou routou.
- pmg
- Člen | 372
Na linku /article/prvni-clanek/comments by som zobrazoval len samotné komentáre.
Ano, tak jsem to myslel. Ale jak to naroutovat?
$router[] = new Route('<presenter>/<item>/<action>', array(
'action' => 'show',
));
Item
je v tomto případě název článku a view
buď show nebo comments. Při výchozím view to ale nechá na konci lomítko.
Buď bych potřeboval pro každou úroveň zvláštní routu, nebo nějaký
výstupní filtr pro adresu (zdědit Route).
Pokud ale uvážíme, že každá položka adresáře se může proměnit v samotný podadresář, možná by nebylo od věci tam to koncové lomítko ponechat vždy (jako třeba na Rootu). Dalším argumentem pro tuto variantu je, že za doménovou částí se to lomítko také uvádí vždy.
Mně se ten přebytek lomítek ale nelíbí, tak jsem se poohlédl ještě po
něčem jiném. Stačí stanovit nějakou rozumnou mez a danou položku označit
definitivně za soubor. Cokoliv potom následuje se už předává jen jako
parametr. Zvažuji, jestli místo vynechaného koncového lomítka na konec
nepřídávat příponu html
. Stránka se pak jeví tak krásně
staticky.
Kromě toho to také řeší případ, kdy některá stránka opravdu
statická je (umístěná pod document_root
). Formát adresy
zůstává pořád stejný a také je jasné, že nejde o požadavek na
výchozí soubor v adresáři, za který jsme nenapsali lomítko.
Takže třeba /articles/prvni-clanek.html?show=comments
. Taková
cool-URI v retro stylu…
- pmg
- Člen | 372
Doufám, že rozumím otázce. Podle mě se proměnná přidá za lomítko jen tehdy, pokud by tam to lomítko bylo i bez ní. Dá se udělat routa pro GET parametry.
- David Grudl
- Nette Core | 8218
pmg napsal(a):
Item
je v tomto případě název článku aview
buď show nebo comments. Při výchozím view to ale nechá na konci lomítko. Buď bych potřeboval pro každou úroveň zvláštní routu, nebo nějaký výstupní filtr pro adresu (zdědit Route).
Což je nečistší způsob. Zdědit Route a constructUrl by obsahoval něco
jako return rtrim(parent::constructUrl(...), '/')