|
1 |
| -Модули |
2 |
| -****** |
3 |
| - |
4 |
| -.[perex] |
5 |
| -Модулите внасят яснота в приложенията на Nette, като улесняват лесното им разделяне на логически единици. |
6 |
| - |
7 |
| -Подобно на организирането на файловете в папки на твърдия диск, в Nette можем да разделим презентатори, шаблони и други спомагателни класове на модули. Как работи това на практика? Просто чрез включване на нови поддиректории в структурата. Ето един пример за структура с два модула - Front и Admin: |
8 |
| - |
9 |
| -/--pre |
10 |
| -app/ |
11 |
| -├── UI/ |
12 |
| -│ ├── <b>Admin/</b> ← Admin module |
13 |
| -│ │ ├── @layout.latte |
14 |
| -│ │ ├── Dashboard/ |
15 |
| -│ │ │ ├── DashboardPresenter.php |
16 |
| -│ │ │ └── default.latte |
17 |
| -│ │ └── ... |
18 |
| -│ ├── <b>Front/</b> ← Front module |
19 |
| -│ │ ├── @layout.latte |
20 |
| -│ │ ├── Home/ |
21 |
| -│ │ │ ├── HomePresenter.php |
22 |
| -│ │ │ └── default.latte |
23 |
| -│ │ └── ... |
24 |
| -\-- |
25 |
| - |
26 |
| -Тази структура на директориите е отразена в пространствата от имена на класовете, така че например `DashboardPresenter` се намира в пространството от имена `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 |
| -В приложението се позоваваме на презентатора `Dashboard` в рамките на модула `Admin`, като използваме запис с двоеточие като `Admin:Dashboard`. За неговото действие `default` го наричаме `Admin:Dashboard:default`. |
38 |
| - |
39 |
| -Представената структура не е твърда; в конфигурацията можете [напълно |#mapping] да [я адаптирате към вашите нужди |#mapping]. .[tip] |
40 |
| - |
41 |
| -Модулите могат да включват всички други файлове, като компоненти и спомагателни класове, в допълнение към презентаторите и шаблоните. Ако обмисляте къде да ги поставите, помислете за използването на папка `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 |
| -Вложени модули .[#toc-nested-modules] |
56 |
| -------------------------------------- |
57 |
| - |
58 |
| -Модулите могат да имат няколко нива на влагане, подобно на структурата на директориите на диска: |
59 |
| - |
60 |
| -/--pre |
61 |
| -app/ |
62 |
| -├── UI/ |
63 |
| -│ ├── <b>Blog/</b> ← Blog module |
64 |
| -│ │ ├── <b>Admin/</b> ← Admin submodule |
65 |
| -│ │ │ ├── Dashboard/ |
66 |
| -│ │ │ └── ... |
67 |
| -│ │ ├── <b>Front/</b> ← Front submodule |
68 |
| -│ │ │ ├── @layout.latte |
69 |
| -│ │ │ ├── Home/ |
70 |
| -│ │ │ └── ... |
71 |
| -│ ├── <b>Forum/</b> ← Forum module |
72 |
| -│ │ └── ... |
73 |
| -\-- |
74 |
| - |
75 |
| -Модулът `Blog` е разделен на подмодули `Admin` и `Front`. Това е отразено и в пространствата от имена, които след това се появяват като `App\UI\Blog\Admin` и по подобен начин. За да се позовем на презентатора `Dashboard` в рамките на подмодула `Admin`, го наричаме `Blog:Admin:Dashboard`. |
76 |
| - |
77 |
| -Влагането може да бъде толкова дълбоко, колкото е необходимо, като позволява създаването на подмодули. |
78 |
| - |
79 |
| -Например, ако в администрацията имате много презентатори, свързани с управлението на поръчки, като `OrderDetail`, `OrderEdit`, `OrderDispatch` и т.н., може да създадете модул `Order`, в който ще бъдат организирани презентатори като `Detail`, `Edit`, `Dispatch` и други. |
80 |
| - |
81 |
| - |
82 |
| -Създаване на връзки .[#toc-creating-links] |
83 |
| ------------------------------------------- |
84 |
| - |
85 |
| -Връзките в главните шаблони са относителни към текущия модул. По този начин връзка `Foo:default` води до главния `Foo` в същия модул като текущия главен. Например, ако текущият модул е `Front`, връзката изглежда по следния начин |
86 |
| - |
87 |
| -```latte |
88 |
| -<a n:href="Product:show">odkaz na Front:Product:show</a> |
89 |
| -``` |
90 |
| - |
91 |
| -Връзката е относителна, дори ако името на модула е част от нея, тогава той се счита за подмодул: |
92 |
| - |
93 |
| -```latte |
94 |
| -<a n:href="Shop:Product:show">odkaz na Front:Shop:Product:show</a> |
95 |
| -``` |
96 |
| - |
97 |
| -Абсолютните връзки се записват подобно на абсолютните пътища на диска, но с двоеточие вместо с наклонена черта. Така абсолютната връзка започва с двоеточие: |
98 |
| - |
99 |
| -```latte |
100 |
| -<a n:href=":Admin:Product:show">odkaz na Admin:Product:show</a> |
101 |
| -``` |
102 |
| - |
103 |
| -За да разберем дали се намираме в определен модул или подмодул, използваме функцията `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 |
| -Маршрутизиране .[#toc-routing] |
113 |
| ------------------------------- |
114 |
| - |
115 |
| -Вижте [главата за маршрутизиране |routing#modules]. |
116 |
| - |
117 |
| - |
118 |
| -Картографиране .[#toc-mapping] |
119 |
| ------------------------------- |
120 |
| - |
121 |
| -Съпоставянето определя правилата за извеждане на името на класа от името на водещия. Тези правила се посочват в [конфигурацията |configuration] под ключа `application › mapping`. |
122 |
| - |
123 |
| -Структурите на директориите, споменати по-рано на тази страница, се основават на следното съпоставяне: |
124 |
| - |
125 |
| -```neon |
126 |
| -application: |
127 |
| - mapping: App\UI\*\**Presenter |
128 |
| -``` |
129 |
| - |
130 |
| -Как работи картографирането? За по-добро разбиране нека първо си представим приложение без модули. Искаме класовете на презентаторите да попадат в пространството от имена `App\UI`, така че презентаторът `Home` да се съпостави с класа `App\UI\HomePresenter`. Това може да се постигне с тази конфигурация: |
131 |
| - |
132 |
| -```neon |
133 |
| -application: |
134 |
| - mapping: App\UI\*Presenter |
135 |
| -``` |
136 |
| - |
137 |
| -Това съпоставяне се извършва чрез замяна на звездичката в маската `App\UI\*Presenter` с името на презентатора `Home`, в резултат на което се получава крайното име на класа `App\UI\HomePresenter`. Просто! |
138 |
| - |
139 |
| -Въпреки това, както можете да видите в примерите в тази и други глави, ние поставяме класовете на водещите в едноименни поддиректории, например водещият `Home` е картографиран към клас `App\UI\Home\HomePresenter`. Това се постига чрез удвояване на звездичката (изисква Nette Application 3.2): |
140 |
| - |
141 |
| -```neon |
142 |
| -application: |
143 |
| - mapping: App\UI\**Presenter |
144 |
| -``` |
145 |
| - |
146 |
| -Сега нека преминем към картографиране на презентатори в модули. Можем да дефинираме специфични съпоставки за всеки модул: |
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 |
| -Според тази конфигурация презентаторът `Front:Home` се съотнася към класа `App\UI\Front\Home\HomePresenter`, а презентаторът `Api:OAuth` се съотнася към класа `App\Api\OAuthPresenter`. |
157 |
| - |
158 |
| -Тъй като модулите `Front` и `Admin` имат сходен подход на картографиране и вероятно има повече такива модули, е възможно да се създаде общо правило, което да ги замени. Към маската на класа се добавя нова звездичка за модула: |
159 |
| - |
160 |
| -```neon |
161 |
| -application: |
162 |
| - mapping: |
163 |
| - *: App\UI\*\**Presenter |
164 |
| - Api: App\Api\*Presenter |
165 |
| -``` |
166 |
| - |
167 |
| -За вложени модули на няколко нива, като например водещия `Admin:User:Edit`, сегментът със звездичка се повтаря за всяко ниво, в резултат на което се получава клас `App\UI\Admin\User\Edit\EditPresenter`. |
168 |
| - |
169 |
| -Алтернативен запис е да се използва масив, съставен от три сегмента, вместо низ. Този запис е еквивалентен на предишния: |
170 |
| - |
171 |
| -```neon |
172 |
| -application: |
173 |
| - mapping: |
174 |
| - *: [App\UI, *, **Presenter] |
175 |
| - Api: [App\Api, '', *Presenter] |
176 |
| -``` |
177 |
| - |
178 |
| -Ако имаме само едно правило в конфигурацията, общото, можем да го напишем накратко: |
179 |
| - |
180 |
| -```neon |
181 |
| -application: |
182 |
| - mapping: App\UI\*\**Presenter |
183 |
| -``` |
| 1 | +{{redirect:directory-structure}} |
0 commit comments