|
1 |
| -Moduly |
2 |
| -****** |
3 |
| - |
4 |
| -.[perex] |
5 |
| -Moduly vnášejí do Nette aplikací přehlednost díky snadnému členění do logických celků. |
6 |
| - |
7 |
| -Podobně jako na pevném disku organizujeme soubory do jednotlivých složek, tak i v Nette můžeme presentery, šablony a další pomocné třídy rozdělovat do modulů. Jak to funguje v praxi? Jednoduše začleníme do struktury nové podadresáře. Příklad takové struktury se dvěma moduly Front a Admin: |
8 |
| - |
9 |
| -/--pre |
10 |
| -app/ |
11 |
| -├── UI/ |
12 |
| -│ ├── <b>Admin/</b> ← modul Admin |
13 |
| -│ │ ├── @layout.latte |
14 |
| -│ │ ├── Dashboard/ |
15 |
| -│ │ │ ├── DashboardPresenter.php |
16 |
| -│ │ │ └── default.latte |
17 |
| -│ │ └── ... |
18 |
| -│ ├── <b>Front/</b> ← modul Front |
19 |
| -│ │ ├── @layout.latte |
20 |
| -│ │ ├── Home/ |
21 |
| -│ │ │ ├── HomePresenter.php |
22 |
| -│ │ │ └── default.latte |
23 |
| -│ │ └── ... |
24 |
| -\-- |
25 |
| - |
26 |
| -Tato adresářová struktura se odráží ve jmenných prostorech tříd, takže například `DashboardPresenter` se nachází ve jmenném prostoru `App\UI\Admin\Dashboard`: |
27 |
| - |
28 |
| -```php |
29 |
| -namespace App\UI\Admin\Dashboard; |
30 |
| - |
31 |
| -class DashboardPresenter extends Nette\Application\UI\Presenter |
32 |
| -{ |
33 |
| - // ... |
34 |
| -} |
35 |
| -``` |
36 |
| - |
37 |
| -Na presenter `Dashboard` uvnitř modulu `Admin` odkazujeme v aplikaci pomocí dvojtečkové notace jako na `Admin:Dashboard`. Na jeho akci `default` potom jako na `Admin:Dashboard:default`. |
38 |
| - |
39 |
| -Představená struktura není pevná; můžete si ji zcela [přizpůsobit dle svých potřeb|#mapování] v konfiguraci. .[tip] |
40 |
| - |
41 |
| -Moduly mohou kromě presenterů a šablon samozřejmě zahrnovat všechny ostatní soubory, jako jsou například komponenty a pomocné třídy. Pokud uvažujete, kam je zařadit, zvažte využití složky `Accessory`: |
42 |
| - |
43 |
| -/--pre |
44 |
| -app/ |
45 |
| -├── UI/ |
46 |
| -│ ├── Admin/ |
47 |
| -│ │ ├── <b>Accessory/</b> |
48 |
| -│ │ │ ├── FormFactory.php |
49 |
| -│ │ │ └── AdminLayout.php |
50 |
| -│ │ ├── Dashboard/ |
51 |
| -│ │ └── ... |
52 |
| -\-- |
53 |
| - |
54 |
| - |
55 |
| -Vnořené moduly |
56 |
| --------------- |
57 |
| - |
58 |
| -Moduly mohou mít více úrovní zanoření, podobně jako adresářová struktura na disku: |
59 |
| - |
60 |
| -/--pre |
61 |
| -app/ |
62 |
| -├── UI/ |
63 |
| -│ ├── <b>Blog/</b> ← modul Blog |
64 |
| -│ │ ├── <b>Admin/</b> ← submodul Admin |
65 |
| -│ │ │ ├── Dashboard/ |
66 |
| -│ │ │ └── ... |
67 |
| -│ │ ├── <b>Front/</b> ← submodul Front |
68 |
| -│ │ │ ├── @layout.latte |
69 |
| -│ │ │ ├── Home/ |
70 |
| -│ │ │ └── ... |
71 |
| -│ ├── <b>Forum/</b> ← modul Forum |
72 |
| -│ │ └── ... |
73 |
| -\-- |
74 |
| - |
75 |
| -Modul `Blog` je rozdělen na submoduly `Admin` a `Front`. To se projeví i ve jmenných prostorech, které pak budou vypadat jako `App\UI\Blog\Admin` a podobně. Na presenter `Dashboard` v rámci submodulu odkazujeme jako na `Blog:Admin:Dashboard`. |
76 |
| - |
77 |
| -Zanoření může být libovolně hluboké, což umožňuje vytvářet sub-submoduly. |
78 |
| - |
79 |
| -Pokud například v administraci máte mnoho presenterů týkajících se správy objednávek, jako jsou `OrderDetail`, `OrderEdit`, `OrderDispatch` atd., můžete pro lepší organizovanost vytvořit modul `Order`, ve kterém budou presentery `Detail`, `Edit`, `Dispatch` a další. |
80 |
| - |
81 |
| - |
82 |
| -Vytváření odkazů |
83 |
| ----------------- |
84 |
| - |
85 |
| -Odkazy v šablonách presenterů jsou relativní vůči aktuálnímu modulu. Tedy odkaz `Foo:default` vede na presenter `Foo` v tomtéž modulu, v jakém je aktuální presenter. Pokud je aktuální modul například `Front`, pak odkaz vede takto: |
86 |
| - |
87 |
| -```latte |
88 |
| -<a n:href="Product:show">odkaz na Front:Product:show</a> |
89 |
| -``` |
90 |
| - |
91 |
| -Odkaz je relativní i pokud je jeho součástí název modulu, ten se pak považuje za submodul: |
92 |
| - |
93 |
| -```latte |
94 |
| -<a n:href="Shop:Product:show">odkaz na Front:Shop:Product:show</a> |
95 |
| -``` |
96 |
| - |
97 |
| -Absolutní odkazy zapisujeme analogicky k absolutním cestám na disku, jen místo lomítek jsou dvojtečky. Tedy absolutní odkaz začíná dvojtečkou: |
98 |
| - |
99 |
| -```latte |
100 |
| -<a n:href=":Admin:Product:show">odkaz na Admin:Product:show</a> |
101 |
| -``` |
102 |
| - |
103 |
| -Pro zjištění, zda jsme v určitém modulu nebo jeho submodulu, použijeme funkci `isModuleCurrent(moduleName)`. |
104 |
| - |
105 |
| -```latte |
106 |
| -<li n:class="isModuleCurrent('Forum:Users') ? active"> |
107 |
| - <a n:href="Product:">...</a> |
108 |
| -</li> |
109 |
| -``` |
110 |
| - |
111 |
| - |
112 |
| -Routování |
113 |
| ---------- |
114 |
| - |
115 |
| -Viz [kapitola o routování |routing#Moduly]. |
116 |
| - |
117 |
| - |
118 |
| -Mapování |
119 |
| --------- |
120 |
| - |
121 |
| -Mapování definuje pravidla pro odvozování názvu třídy z názvu presenteru. Specifikujeme je v [konfiguraci|configuration] pod klíčem `application › mapping`. |
122 |
| - |
123 |
| -Adresářové struktury uváděné výše na této stránce vycházejí z tohoto mapování: |
124 |
| - |
125 |
| -```neon |
126 |
| -application: |
127 |
| - mapping: App\UI\*\**Presenter |
128 |
| -``` |
129 |
| - |
130 |
| -Jak mapování funguje? Pro lepší pochopení si nejprve představme aplikaci bez modulů. Chceme, aby třídy presenterů spadaly do jmenného prostoru `App\UI`, aby se presenter `Home` mapoval na třídu `App\UI\HomePresenter`. Což dosáhneme touto konfigurací: |
131 |
| - |
132 |
| -```neon |
133 |
| -application: |
134 |
| - mapping: App\UI\*Presenter |
135 |
| -``` |
136 |
| - |
137 |
| -Mapování funguje tak, že název presenteru `Home` nahradí hvězdičku v masce `App\UI\*Presenter`, čímž získáme výsledný název třídy `App\UI\HomePresenter`. Jednoduché! |
138 |
| - |
139 |
| -Jak ale vidíte v ukázkách v této a dalších kapitolách, třídy presenterů umisťujeme do eponymních podadresářů, například presenter `Home` se mapuje na třídu `App\UI\Home\HomePresenter`. Toho dosáhneme zdvojením dvojtečky (vyžaduje Nette Application 3.2): |
140 |
| - |
141 |
| -```neon |
142 |
| -application: |
143 |
| - mapping: App\UI\**Presenter |
144 |
| -``` |
145 |
| - |
146 |
| -Nyní přistoupíme k mapování presenterů do modulů. Pro každý modul můžeme definovat specifické mapování: |
147 |
| - |
148 |
| -```neon |
149 |
| -application: |
150 |
| - mapping: |
151 |
| - Front: App\UI\Front\**Presenter |
152 |
| - Admin: App\UI\Admin\**Presenter |
153 |
| - Api: App\Api\*Presenter |
154 |
| -``` |
155 |
| - |
156 |
| -Podle této konfigurace se presenter `Front:Home` mapuje na třídu `App\UI\Front\Home\HomePresenter`, zatímco presenter `Api:OAuth` na třídu `App\Api\OAuthPresenter`. |
157 |
| - |
158 |
| -Protože moduly `Front` i `Admin` mají podobný způsob mapování a takových modulů bude nejspíš více, je možné vytvořit obecné pravidlo, které je nahradí. Do masky třídy tak přibude nová hvězdička pro modul: |
159 |
| - |
160 |
| -```neon |
161 |
| -application: |
162 |
| - mapping: |
163 |
| - *: App\UI\*\**Presenter |
164 |
| - Api: App\Api\*Presenter |
165 |
| -``` |
166 |
| - |
167 |
| -Pro vícenásobně zanořené moduly, jako je například presenter `Admin:User:Edit`, se segment s hvězdičkou opakuje pro každou úroveň a výsledkem je třída `App\UI\Admin\User\Edit\EditPresenter`. |
168 |
| - |
169 |
| -Alternativním zápisem je místo řetězce použít pole skládající se ze tří segmentů. Tento zápis je ekvivaletní s předchozím: |
170 |
| - |
171 |
| -```neon |
172 |
| -application: |
173 |
| - mapping: |
174 |
| - *: [App\UI, *, **Presenter] |
175 |
| - Api: [App\Api, '', *Presenter] |
176 |
| -``` |
177 |
| - |
178 |
| -Pokud bychom měli v konfiguraci jen jediné pravidlo, ono obecné, můžeme zkráceně zapsat: |
179 |
| - |
180 |
| -```neon |
181 |
| -application: |
182 |
| - mapping: App\UI\*\**Presenter |
183 |
| -``` |
| 1 | +{{redirect:directory-structure}} |
0 commit comments