Komplexní routování ve vlastním routeru dále neúnosné

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

Ahoj,

mám napsaný vlastní router, který už začíná být tak komplexní, že se to zdá být do budoucna neúnosné. Načrtnu možná URL:

/cs/cervena-rajcata/
→ presenter: rajcata, id: 38

/cs/rajcata-se-zelenou-slupkou/
→ presenter: rajcata, id: 44

/en/salade-with-tomatoes/edit/
→ presenter: rajcata, action: edit (if $user->isAllowed(…), id: 31

/cs/ceske-hrusky/

/cs/hrusky-z-toskanska/

/cs/neidentifikovane-hrusky/
→ presenter: hrusky, ids: …

Podstatou je, že na druhé úrovni je řetězec, který identifikuje presenter na základě obsahu v databázi. Toto zatím to řeším po sobě jdoucími ify, kterými zkouším, ke kterému presenteru dané url náleží. Pro více presenterů toto řešení ale začíná být neúnosně komplikované:

<?php
public function match(IHttpRequest $httpRequest) {

	$path = explode( "/", $httpRequest->getUri()->relativeUri );
	$httpResponse = Environment::getHttpResponse();
	...

	//nejprve musím vyřešit jazyk
	if( preg_match( "/^cs|en$/", $path[0], $matches ) ) {
		// hrozně otrocká obsluha
		...
	}

	if( $path[1] == "pridat-rajce" ) {
		$this->presenter = "rajcata";
		$this->action = "pridat";
	} else if( $path[1] == "pridat-hrusku" ) {
		$this->presenter = "rajcata";
		$this->action = "pridat";
	} else if( $id = ModelHrusek::getIdFromSlug( $path[1] ) ) {
		// obsluha hrušek
	} else if( $id = ModelRajcat::getIdFromSlug( $path[1] ) ) {
		// obsluha rajčat
	} else if(
	...
	}
	...
}
?>

Tohle řešení se mi fakt vůbec nelíbí, jen nevím, jak ta pravidla definovat nějak lépe. Řešil to někdy někdo?

Díky.

blacksun
Člen | 177
+
0
-

Co to mít rovnou celý v databázi, kde by si podle stringu z url vybral rovnou presenter, akci i id?

knyttl
Člen | 196
+
0
-

Já to tak v podstatě mám. Jenže to routování je celé značně složitější. Není to, jen o tom, co jsem zmínil. Hledám prostě nějaký rozumnější postup jak routovat, než jen pomocí po sobě jdoucích ifů.

Panda
Člen | 569
+
0
-

Rozdělení do několika rout. Pro každý objekt (hruška, rajče, …) udělat jednu routu, pokud by jich pak mělo být víc, tak použít jednu obecnou databázovou routu. Určitě by také bylo dobré odpustit si podmínky typu $path[1] == "pridat-rajce" a použít klasickou routu <presenter>/<action> (pozor, taková obecná routa musí být na konci!), případně masku pridat-<presenter> (+ případná překladová tabulka).

Editoval Panda (18. 8. 2010 8:55)

westrem
Člen | 398
+
0
-

Mozno sa mylim, ale nie je toto tradicny priklad na Prekladovu tabulku, pripadne lepsie, filtrovacie funkcie ?

Mas string a ten potrebujes napasovat na presenter.

Navic, taketo zasebou iduce ify su fakt bad practice, nejak ma nedokaze napadnut ani okrajove riesenie, kde by sa funkcionalita nutne musela riesit X ifami ako niecim krajsim.

knyttl
Člen | 196
+
0
-

Díky, ty filrty vypadají slibně.

Editoval knyttr (26. 8. 2010 13:50)