Router

Přesměrovávané routy

Pokud se rozhodnete změnit URL některých stránek, Router to usnadní i vašim návštěvníkům. Stačí určit (flagem Route::REDIR), které routy se mají přesměrovávat a kam. Přesměrování proběhne automaticky a prohlížeči se posílá odpovídající hlavička (301 Moved Permanently).
Cílové URL se zadávají metodě addRoute() jako 4. parametr, a to dvěma způsoby - jako pole parametrů, nebo callback:

Pole parametrů

Jednodušší způsob, vhodný hlavně pro jednotlivé stránky, je zadat pole parametrů, ze kterého se cílová URL vytvoří. Pole má mít stejný formát jako to, které předáváte metodě url().

$cil = array(
    'controller' => 'novy',
    'action'     => Router::COPY_OLD_VALUE,
);

// tato se přesměrovává
$router->addRoute('/:controller<stary>/:action', array(), Route::REDIR, $cil);

// a podle této se složí cílová URL
$router->addRoute('/:controller/:action');

$router->parseUrl('/stary/nejakaAkce'); // přesměruje na: /novy/nejakaAkce

Pokud jako hodnotu některého parametru pro cílové URL zadáte konstantu Router::COPY_OLD_VALUE, použije se pro tento parametr hodnota ze staré URL (názvy parametrů se musí shodovat).

Callback

Na složitější určení cílové URL použijte callback. Příklad: na webu univerzity jsou profily lektorů (dostupné přes /vyucujici/[jménoPedagoga]) a vedení fakulty chce přidat "aliasy" URL u vdaných/ženatých. Callback funkce dostane jako jediný argument pole parametrů z URL a vrací pole parametrů pro metodu url. V příkladu je použita anonymní funkce (PHP 5.3+), ale stejně tak lze zadat jakýkoli jiný platný callback včetně metod volaných přes __call (callback se validuje funkcí is_callable).

$callback = function($params)    {
    $stastneSvoji = array(
        'Novakova-Klara'  => 'Susilova-Novakova-Klara',
        'Petrova-Marketa' => 'Vladigerova-Marketa',
    );
    $cil = array(
        'controller' => Router::COPY_OLD_VALUE,
        'action'     => Router::COPY_OLD_VALUE);
    if (isset($stastneSvoji[$route['jmeno']]))    {
        $cil['jmeno'] = $stastneSvoji[$route['jmeno']];
    } else {
        $cil['jmeno'] = $params['jmeno'];
    }

    return $cil;
};

$router->addRoute('/:controller<vyucujici>/:action', array(), Route::REDIR, $callback);

NB: Callback musí vždy vracet pole parametrů, z něhož lze vygenerovat URL. V situaci, kdy překládáme adresy přes databázi pedagogů a někteří už na škole neučí (= nejsou už v databázi, ale někde na netu stále ještě existují odkazy na jejich staré profily), musí callback vracet parametry pro jinou platnou URL - např. přehled pedagogů. V opačném případě metoda parseUrl vyhodí výjimku.

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