Proč ne reverzní routování
Všichni, kdo se trochu více zajímají o frameworky, jistě mají nějaké
ty zkušenosti s routingem. Ano, díky němu máme ty krásné adresy, to
krásné oddělení na controllery apod. Dnes bude řeč ale o něčem
specifičtějším, o reverzním routingu, neboli o zpětném sestavení URL
adres. Můj názor je zřejmě ovlivněn nepochopením, nezkušeností, snad
i mou neschopností, přesto myslím, že není ojedinělý. Snad. ![]()
Reverzní routing, dále jako tvorba url, implementuje určitě více frameworků. Co vím, tak něco má CakePHP a třeba takové Nette je na něm celé postaveno. Já jsem s ním samozřejmě také kdysi experimentoval a dnes mě můžete přesvědčit, abych se k tomu zase vrátil. Ale teď mám slovo já.
Na úvod je ale důležité zmínit tento fakt. Frameworky používáme
proto, aby nám pomohly, ne proto, abychom s nimi jedno url napsali na
5 řádků. Tedy, zápis musí být jasný, jednoduchý a přitom dostatečně
univerzální.
Kupříkladu si vezměme routing mého blogu:
- první segment url je metoda controlleru (clanek, clanky) – to jsou action
- nebo zde máme url pro administraci (/admin) – to je zase namespace (jinde by to nazvaly spíše modulem)
V Háefku routing vypadá velmi zjednodušeně takhle:
Router::connect('/:action{clanek|clanky}/*', array('controller' => 'posts')); Router::connect('/:namespace{admin}/:controller/:action/*');
Nyní si vypišme možnosti – typy – odkazů:
- z rootu na článek
- z rootu na seznam článků
- z článku na seznam článků
První problém na sebe nenechá dlouho čekat. Jsme na rootu, a chceme jíti do článku. Podle jakého pravidla má framework url vytvořit??? Možné řešení: Defaultně podle aktuálního, jinak si routy pojmenujeme. Stejný problém se opakuje při všech jiných přechodech na jinou routu. Dobře, nutně si tedy musíme routy pojmenovat, a protože jsme na rootu, a žádná routa není aktivní, musíme už zde nutně propašovat název routy do metody, jenž url vytváří.
Další typ odkazů je přecházení na jiné view v rámci stejné routy. Uvažujme, že se všechny parametry-proměnné v url automaticky dědí. V našem příkladu je ovšem dědit nechceme. Musíme je tedy vynulovat, nebo přidat volitelný parametr na dědění. A taky chceme nějakou tu proměnnou přidat. Zde vyplývá další nutnost – mít pojmenované všechny proměnné v routingu.
Tedy, kdybych chtěl jít z toho článku na seznam článků kategorie, ve které je zařazen, musel bych napsat třeba něco takového:
<a href="<?= $this->url('jmeno-prvni-routy', 'posts', 'clanky',
array('kategorie' => $post->category->url), false) ?>">
Seznam článů kategorie</a>
Snad je jasné, co který argument představuje. Poslední je onen povinný/nepovinný argument řešící otázku dědičnosti. Ano, tohoto argumentu bychom se mohli zbavit. Ale ne jednoduše, museli bychom pak vypsat „totální routing“ úplně pro každou „blbost“ a posléze kontrolovat klíče/počty argumentů atp.
Závěrem
Nemíním si routy nijak pojmenovávat, nijak je identifikovat. Proč? No protože bych si ony názvy musel pamatovat, a kdykoliv při psaní odkazů si vzpomínat. Mimo to, zápis url by se prodloužil, a byl by z toho ještě větší maglajs. Dále místo jednoduchého napsání url musím přemýšlet, kde píšu jaký parametr… jestli chcu něco dědit, jak se jmenuje ta proměnná, jestli to náhodou nedědím něco bokem a nějak tak podobně.
Je také ale jasné, že s klasickou ruční tvorbou odkaz se vystačit nedá. Proto na závěr ukázka, jak řešíme podobný problém v Háefku:
<a href="<?= $controller->url('clanky/' . $post->category->title) ?>">
Odkaz na kategorie</a>
Hm, to nic moc, že?
No jistě. Tady právě není co příliš řešit. Dědit
ale Háefko umí.
<a href="<?= $controller->url('clanek/{:post-name}/edit') ?>"> Editovat článek</a> // respektive <?= $this->link('clanek/{:post-name}/edit', 'Editovat článek') ?>
Jako výhoda reverzního routingu se stále hází větami
typu: „Stačí změnit jen routing, url se pak generují automaticky
nová“.
Tak mi prosím ukažte nějaký větší projekt, kde si jen tak změnili url.
He, ehm, ne, url se prostě tak často nemění. Jo, ano, možná jednou,
dvakrát. Ale aby došla tato feature naplnění, pak by to mělo být spíše
každý den. Cena je totiž vysoká. Nejvíc ji žene nahoru komplikovanost
zápisu. Vždy totiž musíme nějak něco více či méně specifikovat.
Přijde mi jednoduší psát rovnou url, s určitými pomocnými vychytávkami, než url nějak „skládat“. Neodpustím si na závěr malé porovnání. Je to jako zápis SQL, někteří ho prostě raději napíšou ručně, jiní ho musí prostě skládat přes všemožné objekty, recordy, fluent interfacy atp. Děkuji, můžete se posadit.

