Router

Šablony URL

Běžná situace - potřebujeme na stránce generovat desítky adres, které se liší hodnotou jediného parametru. Když je budeme skládat metodou $router->url(), musí se pokaždé hledat odpovídající routa a zbytečně se tak zpomaluje aplikace. Lepší by bylo najít správnou routu jen jednou a pak už jen pomocí str_replace dosazovat hodnoty. A přesně k tomu slouží dvojice metod prepareUrlTemplate() a urlFromTemplate().

$router = new Router;
$router->addRoute('/:controller<skupiny>/:action/:nazev');

$router->prepareUrlTemplate('profilySkupin', array(
    'controller' => 'skupiny', 
    'action'     => 'detail',
    'nazev'      => Router::PREPARE,
));    

$data = array('Pink_Floyd', 'Jethro_Tull', 'Collegium_Musicum', 'Omega', 'Stromboli');
foreach ($data as $skupina)    {
    echo $router->urlFromTemplate('profilySkupin', $skupina);
}
Výsledek:
/skupiny/detail/Pink_Floyd
/skupiny/detail/Jethro_Tull
/skupiny/detail/Collegium_Musicum
/skupiny/detail/Omega
/skupiny/detail/Stromboli

Pokud je u variabilní části routy zadaný regulár, je potřeba ke konstantě Router::PREPARE přidat i hodnotu, která bude odpovídat tomu reguláru (jinak by selhalo to první a jediné generování URL). Pořadí konstanty a výchozí hodnoty je libovolné. Výchozí hodnota je určená konstantou Router::DEFAULT_VALUE.

$router->addRoute('/:controller/:action/:id<\\d+>');

$router->prepareUrlTemplate('produktInfo', array(
    'controller' => 'product', 
    'action'     => 'detail',
    'id'         => '1' . Router::PREPARE,
));

$ids = array(123, 78, 345678, 2, 5);
foreach ($ids as $id)    {
    echo $router->urlFromTemplate('produktInfo', $id);
}
Výsledek:
/product/detail/123
/product/detail/78
/product/detail/345678
/product/detail/2
/product/detail/5

Pokud máme routy, ze kterých se určitě nikdy nebude dělat šablona URL, můžeme o tom router informovat flagem Route::FIXED. Při vytváření šablony URL bude takové routy přeskakovat.

$router->addRoute('/:controller<specielni>/:action', array(), Route::FIXED);

NB: Router umí pracovat pouze s jednou doplňovanou hodnotou. Pokud použijeme Router::PREPARE na více místech, všude se doplní stejná hodnota.

A ještě příklad na dosazování hodnoty do query string, např. pro stránkovaný výpis výsledků nějakého vyhledávání:

$router->addRoute('/:controller<vyhledavani>/:kategorie');
$urlParams = array(
    'controller' => 'vyhledavani',
    'kategorie'  => 'knihy',
);
$pocetStran = 5;
$router->prepareUrlTemplate('strana', $urlParams, array('strana' => Router::PREPARE));

for ($i = 1; $i <= $pocetStran; $i++)    {
    echo '<a href="' . $router->urlFromTemplate('strana', $i) . '">' . $i .'</a>';
    echo ($i !== $pocetStran ? ' | ' : '');
}
Výsledek:
<a href="/vyhledavani/knihy?strana=1">1</a> | <a href="/vyhledavani/knihy?strana=2">2</a> |
<a href="/vyhledavani/knihy?strana=3">3</a> | <a href="/vyhledavani/knihy?strana=4">4</a> |
<a href="/vyhledavani/knihy?strana=5">5</a>

Poslední aktualizace: 24. 6. 2012 15:54