IT-Storm

Удаленный код — отлаженный код

Menu

Magento 2: как создать новый модуль?

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.
 
Удачи!!! ;)

Magento 2