Router

Úvod


Rozebrání URL podle routy

Pomocí addRoute() si nadefinujeme routy. Názvy jednotlivých částí routy vždy začínají dvojtečkou (např. :název). Metoda parseUrl() dostane URL, najde pro něj odpovídající routu a vrátí pole obsahující jednotlivé části routy tak, jak jsme si je pojmenovali.

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

$params1 = $router->parseUrl('/clanky/regiony'); // použije se druhá routa
var_dump($params1);

$params2 = $router->parseUrl('/clanky/upravit/123'); // použije se první routa
var_dump($params2);
Výsledek:
URL: /clanky/regiony
array (size=2)
  'controller' => string 'clanky' (length=6)
  'action'     => string 'regiony' (length=7)

URL: /clanky/detail/123
array (size=3)
  'controller' => string 'clanky' (length=6)
  'action'     => string 'detail' (length=6)
  'id'         => string '123' (length=3)

Pozn.: Metodě parseUrl budeme v aplikaci předávat $_GET['route'] (viz .htaccess), ale v příkladech jsou pro názornost použité napevno napsané URL. V dalších ukázkách také budu místo 'controller' => string 'clanky' (length=6) psát už jenom controller = clanky, je to přehlednější.

Nepovinné části routy

Některé části routy můžeme označit jako nepovinné - typický příklad použití jsou např. profily uživatelů, kdy adresa může i nemusí obsahovat ID uživatele. Nepovinné části mají před názvem otazník (např. :?id). Obě routy z předchozího příkladu tak můžeme nahradit jednou:

$router->addRoute('/:controller/:action/:?id);

$params1 = $router->parseUrl('/clanky/regiony');
$params2 = $router->parseUrl('/clanky/upravit/123');
Výsledek:
URL: /clanky/regiony
controller = clanky
action     = regiony
id         = (prázdný řetězec)

URL: /clanky/upravit/123
controller = clanky
action     = upravit
id         = 123

Skládání URL

Při skládání URL - metoda url() - se zadává pole, kde klíče jsou názvy částí routy.

echo $router->url(array(
    'controller' => 'clanky',
    'action'     => 'upravit',
    'id'         => 1234,
));

// nepovinné části můžeme vynechat:

echo $router->url(array(
    'controller' => 'clanky',
    'action'     => 'regiony',
));
Výsledek:
/clanky/upravit/1234
/clanky/regiony

NB: Hotová adresa není url-enkódovaná.

Query string a kotva

Bez ohledu na "pěkné URL" můžeme chtít některé údaje předávat jako query string (pár parametr + hodnota), např. k výstupní URL u výsledků nějakého vyhledávání přidat číslo stránky. Query string se zadává jako druhý parametr metody url(), může to být buď asociativní pole nebo už hotový řetězec s páry název=hodnota.

$router->addRoute('/:controller/:kategorie');
$urlParams = array(
    'controller'  => 'vyhledavani',
    'kategorie'   => 'knihy',
);

echo $router->url($urlParams, array('stranka' => 3));
echo $router->url($urlParams, 'stranka=3');

Oba způsoby zápisu vytvoří stejnou URL. Číslo stránky najdeme jako obyčejně v $_GET['stranka']

/vyhledavani/knihy?stranka=3

Třetí a poslední parametr url() je kotva, abychom ji nemuseli ručně připojovat za hotovou adresu:

echo $router->url($urlParams, null, 'kotva');
echo $router->url($urlParams, 'stranka=3', 'kotva');
Výsledek:
/vyhledavani/knihy#kotva
/vyhledavani/knihy?stranka=3#kotva

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