Router

Předání řízení aplikaci a reakce na chyby

Metoda delegate

Zavoláním metody delegate() předáváme řízení aplikaci - podle parametrů z rozebrané URL zavolá router nějakou metodu nebo funkci, která má na starosti zobrazení stránky. Jako příklad nám stačí jednoduchá routa /:controller/:action/:?id, podle níž se zpracuje URL /uzivatele/profil/34. Výsledné pole parametrů si už určitě umíte představit, ale pro jistotu ho napíšu:

controller = 'uzivatele'
action     = 'profil'
id         = 34

Co přesně se podle toho bude volat, určíme metodou setCallbackMask(). Syntax je jednoduchá - do ostrých závorek patří parametry z URL, mezi název třídy a metody se píše dvojtečka a jednotlivá volání (callbacky) oddělujte čárkou. Pro přehlednost můžete používat mezery, před použitím se z callbacku vyhodí.

// - vytvoří instanci třídy UzivateleController a zavolá její metodu profil()
$router->setCallbackMask('<controller>Controller:<action>');

// - vytvoří instanci třídy Uzivatele a zavolá dvě její metody, 
// nejdřív actionProfil(), a pak renderProfil()
$router->setCallbackMask('<controller>:action<action>, <controller>:render<action>');

// - zavolá obyčejnou funkci uzivatele_profil()
$router->setCallbackMask('<controller>_<action>');

// - anebo nemusíte vůbec využít parametry z URL
$router->setCallbackMask('moje_univerzalni_funkce');

NB: Parametry z URL, které chceme použít v callbacku, musí existovat a nesmí být prázdné. Všechny callbacky musí být spustitelné. Pokud něco z toho není splněno, router vyhazuje výjimky. Jestliže tedy voláte několik metod a některé z nich smí být nedefinované, použijte magickou metodu __call().

Všem volaným funkcím/metodám se jako první argument předává pole parametrů z URL. Pokud je nastaveno více metod stejné třídy, použije se pro ně jen jedna instance. Chcete-li nastavit jiné chování routeru, stačí přepsat/překrýt dvě metody - callbackFromString() (převádí textové zadání na pole callbacků) a delegate() (která je pak prochází a postupně volá).

Zpracování chyb

V případě, že callback selže (např. neexistující metoda/třída), router vyhazuje výjimku. Ještě před tím ale zkusí použít chybový callback. Ten zadáváme stejně jako předchozí, ale nedají se použít parametry z URL (není totiž jisté, jestli zadaná URL vůbec odpovídala některé routě).

// - v případě chyby vytvoří instanci třídy ErrorController a zavolá její metodu index()
$router->setErrorCallback('ErrorController:index');

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