EN | CS | Přihlásit | Registrovat

Nette\Application

Zastřešuje chování Model View Presenteru.

Životní cyklus aplikace

Životní cyklus aplikace se dá rozdělit do těchto bodů:

  1. Router z URL vytvoří objekt PresenterRequest (obsahuje jméno presenteru);
  2. PresenterLoader ze jména presenteru odvodí třídu a případně název souboru;
  3. Presenter volá metody podle aktuálního action & view (případně i subrequestu);
  4. Presenter načítá šablony, ve hře je název presenteru a view;
  5. 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řída Admin_Catalog_DefaultPresenter
  • Admin:Catalog:Default → třída Admin\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 formatPresenter­Class() a formatPresenter­File()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 formatActionMet­hod() a formatRenderMet­hod(). Pro view edit se budou volat metody prepareEdit() a renderEdit(). Další metody presenteru a jeho celý životní cyklus jsou popsány v Nette\Appli­cation\Presen­ter.

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 formatLayoutTem­plateFiles() & formatTemplate­Files(). 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.phtml
  • templates/AdminModule/CatalogModule/Default.@layout.phtml
  • templates/AdminModule/CatalogModule/@layout.phtml
  • templates/@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.phtml
  • templates/AdminModule/CatalogModule/Default.edit.phtml
  • templates/@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.

  • onStartup je spuštěna na začátku životního cyklu ještě před prvním zpracováním pořadavku PresenterRequest a routováním
  • onShutdown je spuštěna, proběhne-li korektně celý životní cyklus aplikace
  • onRequest je 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án
  • onError je spuštěna při zachytávání výjimky v metodě run() pokud je nastaveno zachytávání výjimek $application->catchExceptions == TRUE a 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é:


Login to submit a comment