DI-контейнер

← DI-контейнер

Ashterix

docs(articles): Magento and Symfony examples side by side, request lifecycle as a Mermaid diagram

uk/articles/magento-to-symfony/core/di.md +24 −4

24 24
25 25 ## preference → alias
26 26
27 + ::::columns
28 + :::col
27 29 **Magento** · etc/di.xml
28 30
29 31 ```xml
31 33 for="Vendor\Shipping\Api\RateProviderInterface"
32 34 type="Vendor\Shipping\Model\DhlRateProvider"/>
33 35 ```
34 −
36 + :::
37 + :::col
35 38 **Symfony** · атрибут на реалізації
36 39
37 40 ```php
42 45 {
43 46 }
44 47 ```
48 + :::
49 + ::::
45 50 або в services.yaml:
46 51 ```yaml
47 52 # ...
53 58
54 59 ## virtualType і аргументи → іменовані сервіси
55 60
61 + ::::columns
62 + :::col
56 63 **Magento** · окремий лог-файл через virtualType
57 64
58 65 ```xml
77 84 </arguments>
78 85 </type>
79 86 ```
80 −
87 + :::
88 + :::col
81 89 **Symfony** · канал Monolog + автовайринг за іменем
82 90
83 91 ```yaml
99 107 ) {}
100 108 }
101 109 ```
110 + :::
111 + ::::
102 112
103 113 Назва аргументу `$faqLogger` вибирає канал `faq`. Так само працюють scoped HTTP-клієнти (`HttpClientInterface $erpClient`), пули кешу та lock-фабрики. Загальний випадок, коли треба передати конкретні значення:
104 114
124 134
125 135 ## Plugin → декоратор
126 136
137 + ::::columns
138 + :::col
127 139 **Magento** · after-плагін
128 140
129 141 ```xml
145 157 }
146 158 }
147 159 ```
148 −
160 + :::
161 + :::col
149 162 **Symfony** · декоратор сервісу
150 163
151 164 ```php
167 180 }
168 181 }
169 182 ```
183 + :::
184 + ::::
170 185
171 186 Усі, хто просить `PriceCalculatorInterface`, отримають декоратор, а він викликає оригінал. Відмінності від плагінів:
172 187
185 200
186 201 ## Масиви в di.xml → теги
187 202
203 + ::::columns
204 + :::col
188 205 **Magento** · пул реалізацій
189 206
190 207 ```xml
197 214 </arguments>
198 215 </type>
199 216 ```
200 −
217 + :::
218 + :::col
201 219 **Symfony** · тег + локатор
202 220
203 221 ```php
223 241 }
224 242 }
225 243 ```
244 + :::
245 + ::::
226 246
227 247 Новий формат — це лише новий клас, що реалізує інтерфейс. `#[AutowireIterator]` дає ітератор усіх реалізацій (з пріоритетами), `#[AutowireLocator]` — ліниву мапу за ключем.
228 248