Vytvoření routy s proměnnou
- siberin
- Člen | 6
Ahoj,
s Routama se peru krátce a zatím ne moc úspěšně. potřeboval bych aby fungovala klasická adresa typu: http://adresawebu.cz/…er/action/id, ale také http://adresawebu.cz/…er/action/id.
V obou případech se načte stejný presenter/akce, jen v případě druhém bude proměnná (třeba slug) obsahovat hodnotu z URL. :/
Vyzkoušel jsem kde co, prohledal ledas co, ale stále nejsem spokojený. Nevím, zda lze routu napsat přes definici nebo přes vlastní router.
pokud někdo tušíte víte či máte nějaký chytrý link, budu moc rád. A předem dík, za jakoukoli radu.
- siberin
- Člen | 6
Zatím jsem došel pouze k následující úpravě, která funguje, ale netuším, zda je to zcela správně.
public function createRouter(Model\mCompanies $companies)
{
$router = new RouteList();
$router[] = new Route('[<locale [a-z]{2}>/]<slug>/[<presenter=Default>[/<action=default>[/<id>]]]', array(
'locale' => 'cs',
'slug' => array (
Route::FILTER_IN => function($slug) use ($companies){
$company = $companies->getRows(array("slug" => $slug));
if($company){
return $slug;
} else {
return NULL;
}
},
),
'presenter' => $presenter,
'action' => $action,
'id' => $id,
));
$router[] = new Route('[<locale=cs [a-z]{2}>/][<presenter=Default>[/<action=default>[/<id>]]]');
return $router;
}
Chybí tam ještě FILTER_OUT u kterého vlastně nevím, jak by měl fungovat :)
- Jan Mikeš
- Člen | 771
Tyto řádky máš v kódu zbytečně (defaultní hodnotu id
nechceš nastavovat a pro presenter
a action
máš
nastaveno již v masce):
'presenter' => $presenter,
'action' => $action,
'id' => $id,
Co ti teda v tuto chvíli nefunguje nebo s čím potřebuješ poradit?
Ps. filterOut()
logicky funguje jako opak k
filterIn()
:-)
filterOut()
→ transformuje id na slug
filterIn()
→ transformuje slug na id
U filter in, by jsi měl vracet id záznamu, ty tam vracíš slug, používáš jej jen pro ověření, že záznam existuje? To by podle mě měla být zodpovědnost presenteru a ne routeru.
Editoval Jan Mikeš (4. 12. 2016 16:23)
- Jan Mikeš
- Člen | 771
Pravděpodobně by to šlo udělat přes jednu routu, kde by byl parametr
slug
volitelný, pak
filterIn()
/filterOut()
dává smysl, jinak by router
mohl považovat v případě chybějícího slug
parametru
presenter
jako slug.
Jasně, akorát zkus být co nejvíce konkrétní a jít do detailů, čemu přesně nerozumíš, pak ti bude moci kdokoliv pomoci mnohem lépe a rychleji ;).