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á).
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