- Aplikace
- Databáze
- Šablony
- Formuláře
- Knihovny
- Návody
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.
- 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í.
- 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.
- 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. - 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');
