Adresářová struktura a velikost písmenek
- David Grudl
- Nette Core | 8218
Pár pravidel pro zdárný používání velkých a malých písmenek:
- Ve složce se šablonami je třeba, aby adresáře presenterů začínaly velkými písmeny (viz upravená adresářová struktura).
- V definicích Route psát presentery a moduly stylem PascalCase.
- Doporučuji, abyste i v odkazech psali názvy presenterů a modulů stylem PascalCase, view a signály stylem camelCaps.
Na rozboru životního cyklu se pokusím vysvětlit, jak funguje výchozí chování a jak jej lze upravit. Ž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 akutálního view & action
- 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 view – to toho se zapojuje opět PresenterLoader a Router
ad 1)
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 pomocí
metod addStyle()
a setStyleProperty()
a/nebo
v definici routy použitím modifikátoru:
<presenter #mymod>
.
ad 2)
PresenterLoader (dříve PresenterFactory) má za úkol z názvu presenteru vytvořit název třídy a tuto načíst. Výchozí loader název transformuje takto:
Admin:Catalog:Default
→ třídaAdmin_Catalog_DefaultPresenter
(Admin::Catalog::DefaultPresenter
v PHP 5.3)- zkusí ji načíst nejprve autoloadingem
- pokud se to nezdaří, tak ze souboru
AdminModule/CatalogModule/DefaultPresenter.php
(v tuto chvíli záleží na velikosti písmen).
PresenterLoader zároveň umí korigovat název presenteru, pokud nesedí velikost písmen (třída ale musí být načtena).
Chování lze změnit úpravou metod formatPresenterClass() a formatPresenterFile() v PresenterLoader nebo nahrazením loaderu za svůj.
ad 3)
Presenter z názvu view odvodí název patřičné metody
z formatRenderMethod(). Pro view edit
se bude volat metoda a
renderEdit()
.
ad 4)
Presenter se pokusí podle svého názvu (nezaměňovat s názvem třídy)
načíst šablonu layoutu (ta je nepovinná) a šablonu scény. Kde ji hledá
určují metody formatTemplateLayoutFiles()
& 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
zmíněný 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
Šablonu pro scénu edit
v souborech:
- templates/AdminModule/CatalogModule/Default/edit.phtml
- templates/AdminModule/CatalogModule/Default.edit.phtml
Chování lze, jak jistě tušíte, změnit úpravou metod format.
ad 5)
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ě.
- David Grudl
- Nette Core | 8218
phx napsal(a):
Ahoj Davide jen otazka pro ujasneni:
- nazev presenteru je napriklad:
Admin:MujPresenter:mojeView
- nazev tridy je:
Admin_MujPresenter
Je to tak? Ja jen ze u bodu 3 o nezamenovani nazvu mi to neni zcela jasne.
DIKY
Nazev presenteru by musel byt Admin:Muj
, to
Presenter
se přilepí, až když se z názvu presenteru
formátuje název třídy.