Komplexní routování ve vlastním routeru dále neúnosné
- knyttl
- Člen | 196
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.
- Panda
- Člen | 569
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
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.