Описание модульной системы в 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>