Obsah
Nette\Application
Zastřešuje chování Model View Presenteru.
Životní cyklus aplikace
Životní cyklus aplikace se dá rozdělit do těchto bodů:
- Router z URL vytvoří objekt PresenterRequest (obsahuje jméno presenteru);
- PresenterLoader ze jména presenteru odvodí třídu a případně název souboru;
- Presenter volá metody podle aktuálního action & view (případně i subrequestu);
- Presenter načítá šablony, ve hře je název presenteru a view;
- Renderování: v tomto a předchozím bodě se obvykle vytváří odkazy na jiné presentery a action & view, do toho se zapojuje opět PresenterLoader a Router.
Routování
Routování má na starosti vytváření odkazů a hezkých URL, převod URL mezi moduly, presentery, pohledy a jejich stavy.
Routery:
- SimpleRouter :
index.php?... - Route :
/tiskarny/canon/mx440/
Router Nette\Application\Route má statické pole $styles,
které mimojiné určuje, že parametry module, presenter a view budou
transformovány (filtrovány) pomocí určitých funkcí. To zajistí převody
MyPresenter -> my-presenter atd. Už z routeru tedy vypadne
název presenteru ve tvaru PascalCase. Modifikovat chování lze buď úpravou
pole $styles, nebo přímo v definici routy použitím
modifikátoru: <presenter #mymod>. Filtry pak popisuje
struktura v $styles['#mymod'].
Všechny routery definované pro naši aplikaci jsou uchovávány v objektu
MultiRouter.
Pokud Vám nevyhovuje v něčem chování routerů, které jsou již obsaženy
v Nette, můžete si naimplementovat vlastní router. Jediný požadavek je
implementace rozhraní IRouter.
PresenterLoader
Výchozí loader ze jména presenteru odvodí třídu a případně název souboru takto:
Admin:Catalog:Default→ třídaAdmin_Catalog_DefaultPresenterAdmin:Catalog:Default→ třídaAdmin\Catalog\DefaultPresenter(v PHP 5.3)- Zkusí autoloading (pak umí i korigovat název presenteru, pokud nesedí velikost písmen)
- Zkusí soubor
AdminModule/CatalogModule/DefaultPresenter.php(case-sensitive)
Chování lze změnit úpravou metod formatPresenterClass() a formatPresenterFile() v PresenterLoader nebo nahrazením loaderu za svůj.
Vyvolání metod podle aktuálního action & view
Presenter z názvu action/view odvodí název patřičné metody formatActionMethod()
a formatRenderMethod().
Pro view edit se budou volat metody prepareEdit() a
renderEdit(). Další metody presenteru a jeho celý životní
cyklus jsou popsány v Nette\Application\Presenter.
Načtení šablon
Presenter se pokusí podle svého názvu (nezaměňovat s názvem třídy)
načíst šablonu layoutu (ta je nepovinná) a šablonu view.
Kde ji hledá určují metody formatLayoutTemplateFiles()
& formatTemplateFiles().
Všimněte si množného čísla v názvu – metody vrací pole možných
umístění seřazených podle priority.
Layout pro Admin:Catalog:Default bude hledat v souborech:
templates/AdminModule/CatalogModule/Default/@layout.phtmltemplates/AdminModule/CatalogModule/Default.@layout.phtmltemplates/AdminModule/CatalogModule/@layout.phtmltemplates/@layout.phtml
Soubory prefixované znakem @ nelze podstrčit jako view, tedy
mohou být ve stejné složce se šablonami views. Lze to použít i pro
„podšablony“, které se do jiných šablon inkludují.
Šablonu hledá v souborech:
templates/AdminModule/CatalogModule/Default/edit.phtmltemplates/AdminModule/CatalogModule/Default.edit.phtmltemplates/@global.edit.phtml
Chování lze, jak jistě tušíte, změnit úpravou metod format.
Odkazování
Při odkazování na jiné presentry je vhodné dodržovat konvenci PascalCase, ačkoliv PresenterLoader umí název korigovat.
Nette\Application\Router při vytváření URL má k dispozici
správně zapsaný název presenteru. Aby správně fungovalo vynechávání
defaultních hodnot, je potřeba i defaultní hodnoty zapsat správně.
Události
Jde o vlastnost Nette\Object, kdy
mohu do pole $this->onXyz přidávat „callbacky“ a poté je
hromadně zavolat přes $this->onXyz($arg, ...).
Příklad:
$application->onStartup[] = 'myfunc';
$application->onStartup[] = array($object, 'method');
$application->onStartup(TRUE, 123); // volá myfunc(TRUE, 123) a $object->method(TRUE, 123);
V třídě Aplication je možno použít již přednastavených
událostí: onStartup, onShutdown,
onRequest a onError.
onStartupje spuštěna na začátku životního cyklu ještě před prvním zpracováním pořadavku PresenterRequest a routovánímonShutdownje spuštěna, proběhne-li korektně celý životní cyklus aplikaceonRequestje spuštěna při každém novém požadavku (např. při vytvoření požadavku routerem, forwardu na jiný presenter nebo při potřebě zpracovat chybu error presenterem) a jako parametr je jí předán objekt PresenterRequest, který je aplikací zpracovávánonErrorje spuštěna při zachytávání výjimky v metodě run() pokud je nastaveno zachytávání výjimek$application->catchExceptions == TRUEa je jí předána i zachycená výjimka$exception
I třída Presenter
disponuje událostí a to onShutdown stejně jako
Application, k jejímu zpracování ale dochází před
zpracováním metody shutdown
a jako parametr je jí předána případná výjimka
$exception.
Viz také:
- Model-View-Presenter
- Fully qualified view
- Generování odkazů a Neplatné odkazy
- Suggested directory structure
- Routování
- Nette\Application\MultiRouter
- Nette\Application\SimpleRouter
- Nette\Application\Presenter
- Nette\Application\Presenter API reference



