Implementace vlastní routovací třídy

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

Dobrý den,

rád bych dosáhl vlastního routování tak, že na základě druhé úrovně URL a databáze budu volit presenter s parametry, např.:

/cs/toto-je-nejaka-udalost/

  • nejprve ověří, že cs je jazyk a v databázi zjistí, že „toto-je-nejaka-udalost“ je skutečně událostí, zavolá tedy presenter „events“ a předá mu id události.

/en/toto-je-nejaky-clanek/

  • en je jazyk; mezi událostmi nebylo nalezeno, proto hledá mezi články, najde, proto zavolá presenter „articles“ a předá mu id článku.

Rád bych si tedy vytvořil vlastní třídu, která toto zajistí. Z dokumentace není zřejmé, kam by se vytvořený router měl v adresářové struktuře umístit, ani jak jej správně includovat.

Jeho třída má být děděna od Route, nebo od IRouter?

Děkuji.

Foowie
Člen | 268
+
0
-

Koukni třeba na SimpleSeoRouter . Z toho je patrné, že úplně stačí implementovat rozhrani IRouter.

Kam třídu umístíš, je vpodstatě na tobě. Můžeš ji klidně dát do app/models, app/models/routers, libs/routers, nebo podobně.

Pokud používáš RobotLoader, tak nemusíš třídu includovat vůbec. Pokud ho nepoužíváš, použí standardní include/require.

knyttl
Člen | 196
+
0
-

Díky moc, trochu jsem s tím pohnul, ale asi mi něco hrozně moc uniká.

Pokud mám router takhle:

$router[] = new Route('index.php', array(
    'presenter' => 'Base',
    'action' => 'default'
), Route::ONE_WAY);

$router[] = new Route('<presenter>/<action>/<id>', array(
    'presenter' => 'Events',
    'action' => 'default',
    'id' => NULL,
));

tak je vše v pořádku.

Pokud ale druhou část zakomentuju, tak mi nenajede ani Base a hlásí mi to:

Server Error

The server encountered an internal error and was unable to complete your request. Please try again later.

Proč se mi nezobrazí žádná laděnka?

Editoval knyttr (8. 5. 2010 13:35)

Aurielle
Člen | 1281
+
0
-

Nemáš $application->catchExceptions = TRUE?

knyttl
Člen | 196
+
0
-

Tak dobrá. Už to nehlásí server error, ale laděnka ne a ne se zobrazit:

Pokud v application.php na řádku 156 (v bloku catch(Exception $e)) napíšu „echo $e“, tak se mi vypíše značně obsáhlá exceptiona. Takže ne že by tam žádná nebyla…

Aurielle
Člen | 1281
+
0
-

… ještě se ujisti že máš Debug::enable(Debug::DEVELOPMENT);

knyttl
Člen | 196
+
0
-

Díky, k tomuhle bych se tedy nedostal, nečekal jsem, že „Debug::DEVELOPMENT“ bude mít zásadní význam.

Aurielle
Člen | 1281
+
0
-

Ale tohle rozhodně na produkčním serveru nenechávej zapnuté… Laděnku si zapínej jen u sebe nebo jen pro svoji IP adresu.