Router

Základní podmínkou běhu aplikace je vytvoření routingu, tedy pravidel pro adresování. Routing funguje tak, že na začátku naší aplikace uvedeme seznam rout – speciálních výrazů, na které bude v naší aplikaci možno přijít. Když uživatel zadá adresu, spustí se index.php a začne se požadovaná url adresa porovnávat z námi nadefinovanými routami. Pokud routa vyhovuje, další porovnávání se již nekoná. Z toho plyne, že nejobecnější routy musí být uvedeny až jako poslední. Pro začátek začneme úplně základním routingem a popíšeme si, co co znamená.

$router = $application->getRouter();
$router->connect('/', array('controller' => 'pages'));
$router->connect('/<:controller>');
$router->connect('/<:controller>/<:action>', array(), true);

Nejdříve je nutné získat router a to pomocí metody getRouter() naší aplikace. Dále voláme na router metodu connect(). Popišme si její parametry.

  1. Routovací pravidlo – je jediný povinný parametr; S tímto parametrem se porovnává požadovaná url; můžeme v něm vyznačit proměnné, případně definovat regulárním výrazem, kdy požadovaná url vyhoví.
  2. Defaultní argumentry – pokud se nějaký parametr v samotné url nevyskytuje, ale je jej třeba pro daný routing, pak ho můžete doplnit sem.
  3. Povolit zpracování argumentů – pokud chcete vytvořit routu, která bude fungovat při libovolném počtu argumentů, uveďte jako třetí argument metody true. Nepojmenované argumenty budou pak indexovány od nuly.
  4. Povolit zpracování parametrů – parametry jsou klasické proměnné uvedené za otazníkem. Pokud nejsou povoleny a je url volána s nimi, pak daná url routě nevyhoví.
routa:    ('/<:controller>/<:action>/<:page>')
url:        /pages/show/testovaci-stranka
vyznam:     pages             = controller
            show              = akce
            testovaci-stranka = argument page


routa:    ('/<:controller>/<:action>', null, true)
url:        /tags/show/php/html/css
vyznam:     tags           = controller
            show           = akce
            php            = argument 0
            html           = argument 1
            css            = argument 2


routa:    ('/<:action>, array('controller' => 'posts'), false, true)
url:        /zobraz?page=1&razeni=asc&sloupec=test
vyznam:     posts          = controller
            zobraz         = akce
            1              = parametr page
            asc            = parametr razeni
            test           = parametr test

Z uvedených příkladů je vidět, jak funguje označování neuvedených argumentů, zpracovaní parametrů, či nastavení defaultních hodnot. Veškerá tyto data můžete jednoduše pomocí metod Routeru získat kdykoliv v aplikaci. Mj. jsou také argumenty předané akci. Parametry se akci nepředávají.

Přesnější filtrování url

Pokud chcete přesněji určit možnost vyhovění routy pomocí jednotlivých proměnných, stačí za jejich název udělat mezeru a přidat regulární výraz:

$router->connect('/<:controller>/<:action pridat|smazat|zobrazit>/<:id>');

Na tuto routu se chytnou všechny url, které jako budou na controlleru provádět jednu z akci: pridat, smazat, zobrazit.

Výchozí hodnoty

Co je potřeba, aby mohl být routing zdárně dokončen je pouze jméno controlleru. Další důležitý parametr je action. Pokud action není převzata z routy, nebo není nastavena v defautls, pak je vždy nastavena na index.

Pokud používáte stejné defaultní hodnoty pro více rout, pak je můžete jednoduše nadefinovat pomocí metody setDefaults():

$router->setDefaults(array(
    'controller' => 'posts',
    'action' => 'list'
));
$router->connect('/');
$router->connect('/<:controller posts>');

Služby

Služby je souhrnně pojmenován speciální režim routingu a renderování, který je primárně určen pro rss kanál. Filozofie je taková, že pokud chceme poskytnout alternativní zdroj informací pro nějaká naši stránku, pak nechceme provádět další routing, ale pouze něco málo přidáme k aktuálnímu.

Uveďme si příklad. Máme routing na posts/list, kde zobrazujeme seznam nejnovějších článků. Chceme ale tento seznam poskytnou také přes rss kanál. Pak nám stačí pouze na začátek url dodat /rss/ a (téměř) automaticky se nám vygeneruje požadovaný obsah v požadovaném formátu.

K tomu nám poslouží metoda setService(), jenž nám „zneviditelní“ onen požadavek rss kanálu, takže nám již dříve napsaný routing projde bez problému. Zbytek aplikace pak pozná, že máme aktivní rss a automaticky přepne na alternativné rss layout a načte RssHelper.

$router->setService('rss');

Čtení argumentů a parametrů

Ve chvíli, kdy je routing dokončen, můžeme velmi jednoduše číst všechny argumenty a parametry, které obsahuje požadovaná url.

Čtení argumentů:

# argumenty
$router->getArgs();
$router->getArg('page');
$router->getArg('page', 'defaultni hodnota');

# parametry
$router->getParams();
$router->getParam('sort');
$router->getParam('sort', 'defaultni hodnota');