Опис модульної системи в Magento 2

Система в Magento 2 складається з декількох типів компонентів: теми, модулі, бібліотеки, мовні пакети. А фреймворк Magento 2 пропонує розробникам готовий набір базової логіки, бібліотек і PHP-коду, які успадковуються всіма компонентами системи.

Модулі і теми Magento 2 використовуються в якості елементів для кастомізації: модулі надають бізнес-логіку, а теми надають функції для налаштування зовнішнього вигляду сайту. Модулі можуть залежати один від одного, а можуть бути досить незалежними, щоб забезпечувати максимальну гнучкість налаштування сайту.

 

 

Модульна система в Magento 2

Кожен модуль являє собою логічну групу, яка складається з Блоків, Помічників, Контролерів, Моделей. Ця група незалежна і призначена для того, щоб не впливати на інший функціонал. Таким чином, при використанні модульного підходу, кожен модуль надає свої власні функції з мінімальними залежностями від інших модулів, щоб включення/відключення модуля не впливало на функціональність інших модулів.

 

Модулі Magento 2 розміщуються в папці vendor/magento (при встановленні через composer) або в app/code/Magento (при ручному встановленні). Наприклад, модуль Customer можна знайти в одному з цих місць: app/code/Magento/Customer або vendor/magento/module-customer. У цих папках міститься весь код і конфігурація, які пов’язані з модулем.

 

 

Назва модуля і його декларація

Ім’я кожного модуля визначається у файлі module.xml, який знаходиться в app/code/<Vendor>/<ModuleName>/etc/. Ви повинні назвати модуль відповідно до такої схеми Namespace_Module: де Namespace – це ім’я постачальника модуля (розробника), а Module – це ім’я модуля.

 

Мінімальна інформація, яка необхідна для оголошення модуля:

  • Повна назва модуля
  • Залежності модуля (при їх наявності)

 



Приклад мінімального коду для декларації модуля:

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">   <module name="Namespace_Module" setup_version="2.0.0">   </module>  </config>  

 

 

Залежності модуля

Концепція залежностей грає дуже важливу роль в Magento 2: всі модулі зібрані в логічні групи з унікальними окремими функціями. В таких умовах кілька модулів не можуть відповідати за одну і ту ж функцію. У той же час один модуль не може відповідати за різні функції в Magento 2. Для цього потрібно оголошувати всі залежності. Відключення і/або видалення модуля не призводить до відключення і/або видалення інших модулів. Модулі можуть залежати від таких компонентів, як інші модулі, PHP розширення і бібліотеки.

 

Завдання залежностей модуля

Ви можете управляти залежностями модуля за допомогою 3-х кроків:

  • Перш за все, ви повинні дати ім’я модулю і оголосити його
  • Потім ви повинні оголосити всі залежності
  • При бажанні ви також можете визначити бажаний порядок завантаження

 

Декларація залежностей

Всі залежності перераховані у файлі composer.json кожного модуля. Нижче приклад використання:

app/code/Magento/Catalog/composer.json  {  "name": "magento/module-catalog",  "description": "N/A",  "require": {   "php": "7.0.2|7.0.4|~7.0.6|~7.1.0",   "magento/module-store": "100.2.*",   "magento/module-eav": "101.0.*",   "magento/module-cms": "102.0.*",   "magento/module-indexer": "100.2.*",   …  },  …  }  

 

 

Порядок завантаження залежностей

Щоб оголосити порядок завантаження будь-яких залежностей, ви повинні використовувати елемент <sequence> в файлі module.xml.

Нод <sequence> є необов’язковим елементом, тому він використовується тільки в тих випадках, коли необхідний певний порядок завантаження модулів.

Основний синтаксис:

<sequence>   <module name="Vendor_Module"/>  </sequence>  

 

 

Приклад використання

Файл: vendor/magento/module-customer/etc/module.xml  <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">   <module name="Magento_Customer" setup_version="2.0.12">    <sequence>     <module name="Magento_Eav"/>     <module name="Magento_Directory"/>    </sequence>   </module>  </config>  

 

 

Елемент <sequence> файлу module.xml використовується тільки для визначення порядку завантаження залежностей. Ви повинні використовувати файл composer.json, щоб зробити фактичні оголошення залежностей.

 

 

Огляд впровадження залежностей

Впровадження залежностей означає, що всі залежності передаються в об’єкт, а не витягуються з середовища цим об’єктом.

Залежність (або зв’язок) має на увазі ступінь того, як один компонент покладається на деякий інший компонент для виконання своєї функції. Чим більше ступінь залежності компонента, тим менше його ступінь впровадження в нові проекти.

Диспетчер об’єктів показує середовище залежностей для впровадження в конструктор. Він повинен використовуватися тільки при написанні коду.

 

Типи залежностей модуля

В Magento є два типи залежностей модулів: жорсткі і м’які залежності.

  1. Модуль з жорсткою залежністю не може виконувати будь-які функції без інших модулів, від яких він залежить.
  2. Модуль з м’якою залежністю може працювати без інших модулів, від яких він залежить.

 

Слід пам’ятати, що в разі, коли один модуль використовує код з іншого, він обов’язково повинен явно оголосити залежність.

Послідовність установки: спочатку встановлюється модуль, який служить залежністю для іншого модуля, а потім – модуль, який покладається на нього.

 

 

Модулі та області дії

Модулі визначають не тільки ресурси, які видно і доступно в області, але також і поведінку області.

Magento складається з наступних областей:

  • adminhtml – відповідає за Панель адміністрування Magento 2
  • frontend – відповідає за зовнішній інтерфейс (Storefront)
  • webapi_rest – веб-API REST
  • webapi_soap – SOAP Web API
  • doc

 

Кожна область з усіма конкретними ресурсами оголошує себе в певному модулі. Можна включити і відключити область в модулі. З включеним модулем ви вводите маршрутизатори області в процес маршрутизації загального застосування. При відключеному модулі маршрутизатори області не завантажуються, тому ресурси і спеціальні функції області недоступні.

Майте на увазі, що модуль не повинен залежати від іншої області модуля.

Magento використовує області для ефективного виклику веб-служб – завантажує залежний код для цієї області. Кожна область має свою власну поведінку і вид компонентів, які працюють окремо.

 

 

Угода про розташування модулів

Існують спеціальні стандарти і угоди в Magento 2, які відносяться до розташування модулів в файлової системі.

 

Правила розташування модулів

Ось як виглядає стандартна локалізація для конкретних об’єктів:

Об’єкт Розташування
База коду користувацького модуля app/code/<Vendor>/<Module>
Файли теми app/design/<ОБЛАСТЬ>/<Module>/<theme>
Файли бібліотек lib/<Vendor_Library>