1.2 Опишіть структуру тек Magento 2
💡 НЕОБХІДНО ЗАПАМʼЯТАТИ:
Модулі Magento знаходяться /app/code/Magento
або vendor/Magento
Файли які повʼязані з веб-інтерфейсом знаходяться у view/
Визначте як знайти файли різних типів у Magento 2
/Api: Сервісні Контракти (Service Contracts)
/Api/Data: Дані сервісних контрактів (Data Service Contacts)
/Block: View Models (або шаблон «помічники» ("assistants"))
/Console: Консольні команди
/Controller: Обробники веб-запитів (Web Request Handlers)
/Controller/Adminhtml: Адмін контроллери
/Cron: Cron Job Classes
/etc: Конфігураційні файли
/Helper: Іноді корисно для невеликого, багаторазово використовуваного коду
/i18n: Локалізація (CSV файли)
/Model: Обробка даних і Структури (Data Handling and Structures)
/Model/ResourceModel: Взаємодія з базою даних
/Observer: Слухачі подій
/Plugin: Модифікація функції
/Setup: Модифікація бази даних
/Test:
/Ui: Постачальники даних UI компонентів (UI Component Data Providers)
/view/[area]/layout: директиви XML макетів (layout)
/view/[area]/templates: Шаблони блоків
/view/adminhtml/ui_component: UI компоненти
/view/[area]/web: Web активи (assets)
/view/[area]/web/template: JS шаблони
/view/[area]/requirejs-config.js
Де знаходяться файли, що містять Javascript, HTML і PHP
Як ви знайдете файли, що відповідають за певні функції?
Визначте як знайти файли різних типів у Magento 2
Magento 2 пропонує дуже гнучку систему для побудови і структурування модулів. Наведені нижче відповіді це гібрид кращих практик Magento та тієї свободи що дають вам назви тек та файлів.
Основі файли (core) Magento 2 розташовані у /vendor/magento
або /app/code/Magento
(у випадку якщо ви завантажили Magento з github). Деякі файли підтримки JS та CSS знаходяться у /lib
.
/Api: Сервісні Контракти (Service Contracts)
Тека /Api
зберігає контракти для модулів, які містять специфічні дії (actions), які можна надійно використовувати в різних місцях додатку. Наприклад: \Magento\Catalog\Api\CategoryListInterface
.
/Api/Data: Дані сервісних контрактів (Data Service Contacts)
Ця тека містить інтерфейси що представляють дані. Наприклад - інтерфейс продукт (Product), інтерфейс категорія (Category) або інтерфейс користувач (Customer). Конкретні реалізації цих інтерфейсів зазвичай роблять трішки більше ніж надають геттери (getters) та сеттери (setters) для даних (aka Обʼєкти Передачі Даних (Data Transfer Objects)).
/Block: View Models (або шаблон «помічники» ("assistants"))
В шаблонах повинно бути використано мінімальну кількість коду PHP (розпроділення відповідальності: дивтись тут і тут). Як результат, блоки Magento виконують або надають бізнес логіку для шаблонів. В MVVM (модель, вид(view), вид-модель(view-model)) методологія Magento використовує Блоки (Blocks) як моделі предсталення (View Models).
Однією з проблем успадкування шаблонного блоку - це дуже роздутий конструктор. Це ускладює тестування і повторне використання. Вирішенням цієї проблеми є використання моделі представлення (View Model). І хоча представлення моделей (View Models) знаходиться в теці Block/
вони дуже різні. Представлення моделі (View Model) надає бізнес логіку для блоку, а не функціональність рендерінгу. Це ще одна відмінність у коді, де блок відповідає за виведення свого вмісту, а модель представлення (view model) - за логіку.
Щоб створити блок з моделю представлення (view model), ви повинні зробити щось схоже (адаптер з vendor/magento/module-backend/Block/Template.php
):
<block name="companyname.test" template="CompanyName_ModuleName::template.phtml" >
<arguments>
<argument name="viewModel" xsi:type="object">CompanyName\ModuleName\Block\Test</argument>
</arguments>
</block>
🔗 Корисні посилання:
- Vinai Kopp написав обовʼязкову для прочитання статтю про те, як використовувати ці моделі представлення (view models).
/Console: Консольні команди
Під час запуску bin/magento
в консолі, виводиться перелік доступних команд для запуску. Код для команд повинен знаходитись в теці /Console
. Приклад консольної команди bin/magento catalog:product-attrbutes:cleanup
: /vendor/magento/module-catalog/ Console/Command/ProductAttributesCleanUp.php
.
/Controller: Обробники веб-запитів (Web Request Handlers)
Коли сторінка запитується з сайту Magento, шлях розбивається (parsed) і співвідноситься (matched) з параметрами знайденими в routes.xml
і файлами знайденими в теці /Controller
.
🔗 Корисні посилання:
- Пошук маршруту (route):
vendor/magento/framework/App/FrontController.php
. - Маршрут за замовченням (для більшості фронтенд запитів):
vendor/magento/framework/App/Router/Base.php
Це магічний шлях (magіc path). Magento очікує що адмін контроллери будуть знайдені в цій теці.
/Controller/Adminhtml: Адмін контроллери
📌 MAGENTO 1
Памʼятаєте ще в Magento 1 "старенькі-добренькі-часи" де всі adminhtml файли Magento зберігались в app/code/core/Mage/Adminhtml
(Mage_Admnhtml модуль)? Тепер admin контроллери знаходяться безпосередньо всередині теки самого модуля.
/Cron: Cron Job Classes
Ця тека - стандартне місце зберігання дій (actions) які запускаються за розкладом (cron job).
/etc: Конфігураційні файли
В цій теці знаходяться конфігураційні файли. Наприклад: module.xml
, crontab.xml
, config.xml
, webapi.xml
, di.xml
.
Будь які файли котрі розташовані в теці etc
- глобальні. Область (area) цих файлів можна контролювати, розташовуючи файли в папці з ім'ям необхідної області. Наприклад: di.xml
який розташовується в теці etc/frontend
застосовуватиметься тільки на зовнішньому інтерфейсі (frontend).
Деякі файли повинні бути в папці області (routes.xml
и sections.xml
), деякі шлобальні (acl.xml
) і деякі можуть бути, і глобальними, і обмежені областю(di.xml
).
/Helper: Іноді корисно для невеликого, багаторазово використовуваного коду
У Magento 2 ця тека більше непотрібна. Тим не менш, ядро досі використовує цю папку для зберігання дій (actions).
Кожен метод має бути оголошений статичним (незалежно так це чи ні). У класі помічника (helper class) не зберігаються тимчасові дані (крім впроваджених (injected) класів).
📌 MAGENTO 1
Подумайте, чи є ще більш підходяще місце для того, щоб розташувати код, перш ніж додавати його в загальний простір імен (generic namespace). Оскільки ми більше не обмежені структурою папок Magento, можна створювати інші папки, які більшою мірою відображають свою суть. Наприклад: /Query/TestQuery
замість /Helper/Query/TestQuery
/i18n: Локалізація (CSV файли)
Ця тека, де розташовуються всі CSV файли для перекладу інтерфейсу. У Magento 1 ці файли розташовувалися в app/locale/de_DE/
.
Ці CSV файли складаються з двох колонок: Було (From), Стало (To).
/Model: Обробка даних і Структури (Data Handling and Structures)
В акронімі MVVM - це тека дім для Моделей (Models). Велика кількість класів, які були розташовані раніше в папці /Helper
були перенесені в теку /Model
. Ця папка містить усе що пов'язано зі структурою даних (vendor/magento/module-catalog/Model/Product.php
) для завантаження цих даних (vendor/magento/module-catalog/Model/ProductRepository.php
).
/Model/ResourceModel: Взаємодія з базою даних
Тут представлено те, як дані отримують і зберігають у базу даних. Будь-яка пряма взаємодія з базою даних має відбуватися в цих файлах. Це приклад продуктової ресурс моделі (vendor/magento/module-catalog/Model/ResourceModel/Product.php
).
/Observer: Слухачі подій
Коли Magento запускає подію, викликаються пов'язані з нею слухачі. Це роз'єднує систему. Magento інтегрована з RabbitMQ, що дає ще більше контролю та надійності в цьому процесі. Дані про подію повинні бути збережені в чергу, і виконатись пізніше.
Слухачі подій повинні реалізовувати (implement) ObserverInterface
(\Magento\Framework\Event\ObserverInterface
). Клас спостерігача має бути зрозумілий як призначення його функції. Клас PHP повинен дотримуватися позиції використання TitleCase
, а ім'я події має бути snake_case
. Намагайтеся не поміщати бізнес-логіку в спостерігач. Помістіть логіку в інше місце і додайте цей клас у свій Observer
. Коли вам потрібно буде використовувати цю логіку в іншому місці системи, ви скажете собі дякую.
/Plugin: Модифікація функції
Плагіни це одна з найпотужніших особливостей Magento 2. Вона дає змогу вам модифікувати або змінювати функціональність майже будь-якого класу або інтерфейсу. Плагіни працюють тільки з об'єктами, екземплярами яких є ObjectManager.
Плагіни можуть розташовуватися де завгодно. Magento розташовує їх у папці /Plugins
що робить їх пошук дуже простим. Я вважаю за краще додавати в назву "Plugin" після імені класу, який модифікується. Якщо я модифікую метод у \Magento\Catalog\Api\Data\ProductInterface
,я створюю наступний клас class:/Plugins/Magento/Catalog/ProductPlugin.php
. Це зменшує плутанину під час імпорту класів. Інший підхід полягає в тому, щоб назвати плагін безпосередньо для тієї функції, для якої він написаний. Це допоможе швидше знайти потрібний плагін у структурі модуля (наприклад: MinimumPricePlugin
замість ProductPlugin
, якщо це плагін для Model\Product
).
/Setup: Модифікація бази даних
Перелік файлів:
InstallSchema.php
: встановлює схему таблиці/стовпця, коли модуль встановлюється.UpgradeSchema.php
: змінює схему таблиці/стовпця під час оновлення версії модуля.Recurring.php
: запускається після кожного встановлення або оновлення.InstallData.php
: встановлює дані, коли модуль встановлено.UpgradeData.php
: змінює дані після встановлення модуля, коли оновлюється версія модуля.RecurringData.php
: застосовується до даних після кожного встановлення або оновлення.
🔗 Корисні посилання:
/Test:
Тут знаходяться тести модуля./Test/Unit
містить модульні тести (unit tests). Ви можете запустити тести за допомогою командного рядка: bin/magento dev:tests: run [all, unit, integration, integration-all, static, statc-all, integrity, legacy, default]
/Ui: Постачальники даних UI компонентів (UI Component Data Providers)
Ця тека містить постачальники даних (data providers) і модифікатори для UI компонентів.
/view/[area]/layout: директиви XML макетів (layout)
XML макети пов'язують блоки(/Blocks
) з шаблонами. Це дуже гнучкий спосіб контролювати що і де має відображатися.
/view/[area]/templates: Шаблони блоків
Другом Блоку (Block) є шаблон (template), який відтворює HTML для блоку. Поки блок (у /Block
) надає бізнес логіку, шаблон надає те, як буде відображатися для клієнта - результат роботи бізнес логіки. Не забувайте, що найкраще, коли в шаблон потрапляє якомога менше PHP-коду.
Коли розробляєте модуль, майте на увазі, що ця тека має називатися у множині templates.
/view/adminhtml/ui_component: UI компоненти
Оформлення замовлення на фронтенді також є UI-компонентом, але він налаштований з використанням XML макета, а не XML UI компонента. Ви також можете знайти теку /templates
в середині папки ui_component
що містить деякі шаблони для UI компонентів.
Тека містить XML конфігурації для UI компонентів. Вони використовуються для представлення окремих UI елементів, таких як сітки (grids) і форми (forms), і були розроблені для гнучкої візуалізації користувацького інтерфейсу. Більшість адмін сіток (admin grids) Magento (таких як сітка "Каталог продуктів" і "Замовник (Customer)") складаються з UI компонентів. Оформлення замовлення (checkout) на фронтенді також є UI компонетом.
/view/[area]/web: Web активи (assets)
Це те місце, де розташовані web активи (assets). Це включає в себе JS, CSS (або LESS/SCSS) і зображення.
/view/[area]/web/template: JS шаблони
Тут розташовані HTML шаблони, які можуть бути асинхронно запитані за допомогою Javascript (використовуються для кастомізації Magento за допомогою KnockoutJS). Ці файли часто містять декларативні прив'язки (declarative bindings) KnockoutJS. Ім'я цієї папки вказується в однині template - що може збивати з пантелику, оскільки директорії шаблонів PHTML і XHTML вказуються у множині templates.
/view/[area]/requirejs-config.js
Це RequireJS конфігурація модуля. Ця конфігруація використовується для того, щоб контролювати Javascript залежності, створювати псевдоніми (aliases) і оголошувати міксини (mixins).
Де знаходяться файли, що містять Javascript, HTML і PHP
Javascript: в теці /view/[area]/web/
.
HTML: в теці view/[area]/templates
(розширення таких файлів .phtml)
PHP: будь-яка тека за виключення view/[area]/web/
Як ви знайдете файли, що відповідають за певні функції?
Наведений вище список файлів і папок докладно описує, де і які файли зберігаються.