Adresa bez lomítka na konci

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
pmg
Člen | 372
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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.

Jod
Člen | 701
+
0
-

Na linku /article/prvni-clanek/comments by som zobrazoval len samotné komentáre. V tom prípade sa mi zdá názov článku ako adresár v pohode.

pmg
Člen | 372
+
0
-

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…

Jod
Člen | 701
+
0
-

Podobné routovanie s login sa riešilo tu

Pokial pridáš do linku parameter ktorý neni v routri, premenná sa pridává za lomítko, nie?

pmg
Člen | 372
+
0
-

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.

Jod
Člen | 701
+
0
-

No neviem, ale ja keď som pridal do linku parameter ktorý neni v routri tak sa mi pridá za otáznik (nie lomítko). Platí to aj pre perzistentné, napr backlink pri prihlasovaní.

pmg
Člen | 372
+
0
-

Proměnná se přidá za otazník. Ale otazník se přidá za lomítko, pokud tam nějaké je. V čem je problém?

David Grudl
Nette Core | 8218
+
0
-

pmg napsal(a):

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).

Což je nečistší způsob. Zdědit Route a constructUrl by obsahoval něco jako return rtrim(parent::constructUrl(...), '/')

pmg
Člen | 372
+
0
-

Tak fajn, chtěl jsem se ujistit, že to nepůjde jinak. Díky!