Magento 2 - Привет мир! - Разработка модулей.

В магенто 2 все модули теперь находятся в папке app/code, раньше, в магенто 1, было три вида папок core, local, community, теперь такого деления нет.

Попробуем создать всем известную надпись "Hello Word!", для этого мы создадим модуль, маршрут папок и непосредственно отобразим ее на нашем сайте.

Имена модулей как и в Magento 1 разделены на две части - "VendorName_ModuleName" ("НазваниеКомпании_ИмяМодуля"). например Magento_Product, Magento_Cms.

Давайте назовем наш модуль, например "First_Hello", лень много буковок писать, тогда структура папок нашего модуля будет такой:

app/code/First/Hello

Начальная структура папок готова. Теперь нам нужно создать файл module.xml в папке "app/code/First/Hello/etc" следующего содержания

<?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="First_Hello" setup_version="0.0.1"/> 
   </config>

В корне нашего модуля нужно создать файл registration.php

app/code/First/Hello/registration.php

Содержимое этого файла

<?php 
\Magento\Framework\Component\ComponentRegistrar::register( 
    \Magento\Framework\Component\ComponentRegistrar::MODULE, 
    'First_Hello', 
    __DIR__ 
); 

Наш пустой модуль готов.

 

Статусы модулей и их запуск

Давай проверим статус нашего модуля, для это в консоли надо запустить:

php bin/magento module:status

После выполнения этой команды вы увидите список всех установленных модулей, а во втором списке, будут модули которые еще не установлены, т.е. наш новый модуль:

List of disabled modules:
First_Hello

Это означает что наш модуль правильно настроен, но в данный момент он отключен. Чтобы его активировать, нужно выполнить команду:

php bin/magento module:enable First_Hello

После чего модуль станет активным. Еще можно его активировать просто прописав его в конфигурационный файл:

app/etc/config.php

В нем вы найдете список активных модулей, просто пропишите туда свой:

... 
'First_Hello' => 1, 
... 

Если сейчас открыть сайт в браузере вы увидите ошибку:

There has been an error processing your request

А в логах сайта (var/reports/)

Please upgrade your database: Run "bin/magento setup:upgrade" from the Magento root directory.

Необходимо выполнить требуемую команду:

php bin/magento setup:upgrade

Теперь ваш пустой модуль окончательно установлен. Вы в этом сможете убедиться пройдя по этому пути:

Stores -> Configuration -> Advanced -> Advanced -> Disable Modules Output

Создание пути до модуля (URL адреса)

Для того чтобы вывести надпись "Hello Word!", надо проложить маршрут к нему, т.е. внешний url для нашего модуля.

Url в магенто разделен на три части route_id, controller и action:

http://site.ru/index.php/route_id/controller/action

Index.php необязательный параметр и зависит от настроек дружественных адресов (friendlys url's).

Для того чтобы создать путь к модулю (url), нам нужно создать файл routes.xml.

First/Hello/etc/frontend/routes.xml

Так как нам нужно, чтобы url работал во внешней части сайта, мы его положили в папку frontend, чтобы url работал в административной части, его надо положить в папку adminhtml. Создадим данный файл и назовем этот маршрут firsthello содержимое данного файла:

<?xml version="1.0"?> 
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/App/etc/routes.xsd"> 
    <router id="standard"> 
        <route id="firsthello" frontName="firsthello"> 
            <module name="First_Hello" /> 
        </route> 
    </router> 
</config>

Здесь мы составили первую часть URL

site.ru/firsthello/*

Дальше нам нужно определить контроллер и action для вывода нашего модуля. Если не указывать контроллер и action magento по умолчанию установит index.php, но путь его будет такой - First/Hello/Controller/Index/Index.php

Например мы хотим чтобы конечный url у нас бы такой "http://site.ru/firsthello/hello/world" для этого на нужно создать такой путь папок

First/Hello/Controller/Hello

Внутри папки Hello создадим файл World.php со следующим содержимым

<?php 
namespace First\Hello\Controller\Hello; 
class World extends \Magento\Framework\App\Action\Action 
{ 
    public function __construct( 
        \Magento\Framework\App\Action\Context $context) 
    { 
        return parent::__construct($context); 
    } 
      
    public function execute() 
    { 
        echo 'Hello World'; 
        exit; 
    }  
} 

Теперь если открыть наш путь в браузере, вы должны увидеть надпись "Hello World!". Если путь или надпись у вас не открываются посмотрите в папке - var/generation нету ли тут вашего модуля, т.к. магенто генерирует часть элементов автоматически, поэтому может появиться у вас такой путь в этой папке - var/generation/First/Hello/Controller.