Magento 2: как создать новый модуль?
Модуль — структурный элемент Magento 2 — вся система построена на модулях. Как правило, первым шагом в создании настройки является создание модуля.
В Magento 2 есть два возможных места для модулей: каталог app/code и каталог vendor.
В зависимости от того, как был установлен Magento 2, основные модули могут находиться либо в каталоге vendor/magento/magento-*
(для установки с помощью composer), либо в каталоге app/code/Magento/
(для клонирования GitHub).
Какое из этих мест выбрать для нового модуля?
Если вы создаете модуль для конкретного проекта, лучше всего выбрать каталог app/code
и в дальнейшем фиксировать его в репозитории проекта.
Если вы создаете расширение для повторного использования, лучше использовать composer для его создания и поместить ваш модуль в каталог vendor/<YOUR_VENDOR>/module-something
.
Имя каждого модуля в Magento 2 состоит из двух частей — поставщика и самого модуля. Другими словами, модули сгруппированы по поставщикам, поэтому вам необходимо определить имена поставщиков и модулей. В этом примере давайте назовем поставщика «SpaceX», а модуль «FirstUnit».
Создадим каталог app/code/SpaceX
и внутри этого каталога поместим еще один каталог: FirstUnit
.
Если вы используете командную строку, код будет таким:
cd <каталог проекта>
mkdir app/code/SpaceX
mkdir app/code/SpaceX/FirstUnit
Далее вам нужно создать файл etc/module.xml
. Этот файл необходим для существования модуля.
Этот файл содержит следующую информацию:
- Имя модуля
- Версия модуля
- Зависимости
- Имя модуля определяется каталогами, которые мы только что создали, потому что в Magento 2 имена классов должны соответствовать структуре каталогов. Поскольку мы создали каталоги
SpaceX/FirstUnit
, имя нашего модуля будет SpaceX_FirstUnit, и все классы, принадлежащие этому модулю, будут начинаться с SpaceXFirstUnit, например:SpaceX\FirstUnit\Observer\Test
. - Версия модуля указывает текущую версию схемы базы данных (database schema) и используется при обновлении. Например, предположим, что вы решили изменить схему таблицы в базе данных своего модуля. Вы не можете быть уверены, что это изменение произойдет во всех экземплярах, где развернут код? Изменение базы данных прямыми SQL-запросами не сработает. Вместо этого в Magento 2 есть сценарии установки и обновления в каждом модуле (опционально). Эти сценарии содержат команды (скрипты) для изменения схемы базы данных или данных. Чтобы определить, выполнять скрипт или нет, Magento 2 использует версии модулей. Каждый раз, когда вы вносите новое изменение в базу данных, вы внедряете новую версию модуля и изменяете соответствующий файл
module.xml
. Magento сохраняет текущую версию модуля в базе данных, и если значение базы данных и значение вmodule.xml
не совпадают, он выполнит код обновления. - Зависимости. Если один модуль зависит от другого, в файле
module.xml
будет специальное объявление, определяющее список модулей, от которых зависит текущий модуль. В этом примере мы сделаем наш модуль зависимым отMagento_Catalog
.
app/code/SpaceX/FirstUnit/etc:
mkdir app/code/SpaceX/FirstUnit/etc
В этом каталоге создаём фаил module.xml и помещаем туда следующий код:
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd"> <module name="SpaceX_FirstUnit" setup_version="0.0.1"> <sequence> <module name="Magento_Catalog"/> </sequence> </module> </config>Обратите внимание, что в файле XML мы указали:
Название модуля: SpaceX_FirstUnit (на основе созданных нами каталогов)
Версия: 0.0.1 (начальная версия нашего модуля)
Зависимость: Magento_Catalog. У нас может быть несколько зависимостей. В этом случае мы поместили бы узлы(node) <module name=”..” /> между узлами(нодами) sequence.
Создайте файл
Registration.php
Каждый модуль должен иметь этот файл, который сообщает Magento, как найти модуль.
Продолжая наш пример, создайте файл
app/code/SpaceX/FirstUnit/registration.php
Затем поместите в него следующее содержимое:
<?php /** * Copyright © IT-Storm, Inc. All rights reserved. */ use Magento\Framework\Component\ComponentRegistrar; ComponentRegistrar::register( ComponentRegistrar::MODULE, 'SpaceX_FirstUnit', __DIR__ );Registration.php — это стандартизированный файл, который содержит данные, указанные по одному и тому же шаблону для любых модулей.
Единственное, что меняется, — это имя модуля, в нашем случае это SpaceX_FirstUnit.
Теперь, давайте запустим команду «setup:upgrade».
Выполнение этой команды сделает ваш новый модуль активным, уведомив Magento о его присутствии.
Обратите внимание, что данную и аналогичные CLI команды (команды для интерфейса командносй строки) необходимо выполнять из корневого каталога проекта.
bin/magento setup:upgrade
Отобразится большой объем строк, одна из которой должна быть SpaceX_FirstUnit.
Теперь давайте убедимся что новый модуль активен:
Пока что мы не добавили в наш модуль никакого полезного кода — он по-прежнему пустой (а значит, невидимый).
Чтобы убедиться, что он был распознан, проверим файл
app/etc/config.php
. Он имеет список автоматически сгенерированных модулей, которые активны.
Никогда не редактируйте этот фаил (список) вручную!
Используем следующую команду:
grep SpaceX_FirstUnit app/etc/config.php
Если всё в порядке, в строках вывода данной команды вы должны увидеть название своего модуля.
Также, модуль должен быть виден в списке, который выводит следующая команда:
bin/magento module:status
Включить модуль можно командой:
bin/magento module:enable
Выключить:
bin/magento module:disable
Используйте эти шаги, для успешнго создания новых модулей в Magento 2.