Autor Zpráva
PetrM
Profil *
Dobrý den.

Dělám metodu pro generování url stylem :
$articleUrl = $this->router->buildUrl('article/show/' . $article->alias, '/<controller>/<action>/<article>/');


V defaultním nastavení s mod_rewrite to vrátí něco ve stylu :


Bez mod_rewrite by to vygenerovalo :


S jiným patternem (druhý parametr buildUrl) třeba :


Zajímá mě zda-li je to dobrý přístup a zda se tato metoda hodí do třídy Router?

Děkuji.
Majkl578
Profil
Zkus se podívat sem jak se tohle řeší v Nette Frameworku (zaměř se na definici a na generování). Tam se routy definují při startu aplikace a následné generování odkazů probíhá na základě jiné syntaxe (jiné v tom smyslu, že požadavek na vytvoření je odstníněný od patternu routy, takže routu lze později změnit na jednom místě a ne různě po aplikaci).
PetrM
Profil *
Majkl578:
Co takhle?

$this->router->join('article/show/' . $article->alias, '/<controller>/<action>/<article>/', 'articleShow');


A potom v šabloně udělám {link:articleShow}

Jinak měl bych ještě jeden dotaz.
Když mám dva moduly Article a Categories no jenže v Categories potřebuji vygenerovat odkaz na článek (modul Article), jen vždy při zavolání třeba www.web.cz/categories/test-kategorie se tedy zavolá modul Categories ale ten nemá "ponětí" o tom jak generuje adresy Article, potřeboval bych to nějak centralizovat. Napadlo mě tyhle "obecné" routy do databáze, ale nevím jestli je to tak správně. Nebo mě napadlo udělat modules/Article/Router.php a pokud ho nějaký jiný modul bude potřebovat tak si ho načte a v tom budou ty routy toho Article.
Majkl578
Profil
PetrM:
Vezmu-li způsob, jakým se routy používají v Nette, pak by odkaz z Categories např. na Article (dejme tomu čtení článku - read) vypadal takto: {link Article:read $id}. V tuto chvíli nemám žádné ponětí jak výsledná URL bude vypadat a je mi to jedno, vím jen, že bude odkazovat tam kam má (přemýšlej nad tím v rámci aplikace, nikoliv HTTP dotazů).
Při vytváření odkazu se sestaví nějaké parametry (kam odkazovat, id článku) a postupně se volají všechny předem definované routy. Každá routa ověří svoji vhodnost pro daný požadavek a pokud pasuje, vytvoří URL.
Nox
Profil
PetrM:
A co?
$this->router->url('articleShow', array("article"=> $article->alias));

(nevim jestli to není v Nette podobné, vycházím z Kohany)
PetrM
Profil *
Majkl578
Ano asi chápu, ale pokud vím tak routy se definují za běhu a nikam se neukládají tudíž když člověk vejde na adresu web.cz/categories/test-kategorie tak se načte modul Categories a ten si tam náhází své routy. Tím pádem žádné routy ohledně modulu Article tam nebudou. Tudíž když tedy v šabloně výstupu Categories bude {link Article:read $id} tak musí nějak ten link převést na ten reálný. Takže bud načíst celý modul Article a zavolat jeho nějakou metodu, nebo udělat soubor modules/Article/Router.php který bude obsahovat routy toho daného moduly, takže by se načetl jen tento soubor a podle něj vygeneroval odkaz - přijde mi to méně náročný na výkon, protože když by těch modulů bylo 20 tak by načítání každého asi nebylo moudré.

Chápu to správně?

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: