Как создать простой контроллер и действие в Magento 2

В предыдущем уроке мы рассмотрели на практике процесс создания простого модуля на платформе Magento 2. Этот урок является его дополнением, и сегодня мы рассмотрим практические моменты по созданию простого контроллера и экшена (действия) в Magento 2.

 

 

Шаг №1: Создание модуля

Перейдите в папку app/code и создайте в ней папку {VENDOR} – в нашем случае это Sebweo, а в ней папку {MODULE} – в нашем случае это Test. {VENDOR} – это «производитель» модуля; используйте название своей компании. {MODULE} – это название модуля.

Затем создайте папки Controller и etc в папке Test.

 

Пространство имен:

Ваш модуль находится в пространстве имен Sebweo. Именно в этой папке вы будете «хранить» модули, которые будете создавать. Используйте для своих модулей свое собственное пространство имен.

ВАЖНО: не редактируйте «основные» файлы Magento 2, то есть в папке app/code/Magento (или в vendor/magento/), поскольку это может привести к ошибкам при попытке обновления платформы.

 

 

Шаг №2: Объявление нового модуля в Magento 2

Теперь, когда вы создали основной «каркас» вашего модуля, вы должны «объявить» его в платформе Magento 2. Для этого создайте файл module.xml в папке 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="Sebweo_Test" setup_version="1.0.0">    <sequence>     <module name="Magento_Catalog"/>    </sequence>   </module>  </config>  

 

 

Также нам нужно создать файл регистрации модуля. Перейдите в app/code/Sebweo/Test и создайте файл registration.php с таким содержимым:

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

 



 

После этого запустите следующую команду в консоли (видео-инструкция по консоли для Мадженто 2 здесь):

php bin/magento setup:upgrade  

 

 

Эта команда добавит строку

'Sebweo_Test' => 1  

 

в файл app/etc/config.php. Данная строка означает, что ваш модуль активен. Для неактивных модулей значение 0.

 

 

Шаг №3: Создание контроллера

В папке app/code/Sebweo/Test/Controller создайте папку Proverka, а в ней создайте файл Index.php с таким содержимым:

<?php  namespace Sebweo\Test\Controller\Proverka;  class Index extends \Magento\Framework\App\Action\Action  {   public function execute()   {    echo 'Привет, мир!';    exit();   }  }  

 

 

Здесь мы создали класс Index, который на самом деле является действием (экшеном, action) в Magento 2. По сравнению с 1-й версией Мадженто, в Magento 2 больше нет папки controllers (с контроллерами). Теперь вам нужно создавать файлы для действий. Эти действия расширяют базовый класс \Magento\Framework\App\Action\Action и должны иметь функцию (метод) execute(). В Magento 1.x вы группировали действия в одном контроллере, в 2.х вам нужно группировать классы действий в этой папке.

ВАЖНО: не используйте конструкторы echo и особенно exit в PHP-файлах. Стандарты кода Magento 2 это запрещают. Это можно использовать только временно, и только для тестовых целей.

 

 

 

Шаг №4: Создание маршрута для доступа к контроллеру

Чтобы получить доступ к модулю через внешний интерфейс (фронтенд), вы должны создать маршрут для вашего модуля. Если вам нужно получить доступ к модулю по URL {DOMEN}/testirovka/, вы должны создать папку frontend в папке etc, а затем разместить в ней файл routes.xml с таким содержимым:

<?xml version="1.0"?>  <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd">   <router id="standard">    <route id="sebweo_test" frontName="testirovka">     <module name="Sebweo_Test" />    </route>   </router>  </config>  

 

 

Мы используем «стандартный» (standard) маршрутизатор, который обеспечивает доступ к внешней части нашего модуля. Кроме этого еще есть маршрутизаторы: robots, urlrewrite, cms и default. В качестве идентификатора маршрутизатора (route id) нужно использовать уникальное значение, это может быть, например, {vendor_module}. Значение в ноде frontName используется в URL для доступа к контроллеру во внешнем интерфейсе, т.е., является частью ссылки.

 

 

Некоторые замечания по организации контроллеров

Путь к контроллеру по URL имеет следующий вид:

{DOMEN}/path/controller/index/  

 

где:

  • path – значение нода frontName
  • controller – название папки контролера (в нижнем регистре)
  • index – название файла действия контролера (экшена) (в нижнем регистре)

 

В нашем примере ссылка будет иметь следующий вид:

{DOMEN}/testirovka/proverka/index/  

 

Действие с именем index – это действие, которое Magento выполнит по умолчанию, если вы не укажете действие в URL. Т.е., наша ссылка может иметь и следующий вид:

{DOMEN}/testirovka/proverka/  

 

Открыв обе эти ссылки, вы увидите текст Привет, мир!, т.е., результат выполнения действия в контроллере.

Если вам нужно другое действие (не index), например, View, вам нужно создать файл View.php в папке Proverka с таким содержимым:

<?php  namespace Sebweo\Test\Controller\Proverka;  class View extends \Magento\Framework\App\Action\Action  {   public function execute()   {    echo 'Привет, мир (снова)!';    exit();   }  }  

 

Если вы откроете URL:

{DOMEN}/testirovka/proverka/view  

 

Вы увидите текст Привет, мир (снова)!.

 

 

Возможные ошибки

Если это не работает, в первую очередь попробуйте очистить кэш или отключить его в админке Система > Управление кешем.

Включите отображение сообщений об ошибках:

  • переименуйте local.xml.sample в local.xml в папке pub/errors/
  • раскомментируйте в app/bootstrap.php две строчки:
error_reporting(E_ALL);  ini_set('display_errors', 1);  

 

Ошибка: «Не указана установочная версия для модуля Sebweo_Test» (Setup version for module ‘Sebweo_Test’ is not specified)

Решение: отсутствует файл registration.php в вашем модуле

 

Ошибка: «Пожалуйста, обновите вашу базу данных: Запустите команду «bin/magento setup:upgrade» из корневого каталога Magento (Please upgrade your database: Run «bin/magento setup:upgrade» from the Magento root directory)

Решение: выполните следующую команду из консоли:

php bin/magento setup:upgrade  

 

И запустите перекомпиляцию:

php bin/magento setup:di:compile  

 

Компиляция не активна в режиме разработчика (developer mode), и ее не нужно запускать, когда вы находитесь в производственном режиме (production mode).

Чтобы включить режим разработчика (чтобы не выполнять перекомпиляцию при каждой модификации), выполните следующую команду в консоли:

php bin/magento deploy:mode:set developer  

 

 

Вот и все! Вы успешно создали первый контроллер (маршрутизатор) на Magento 2. Примите наши поздравления!

До следующих уроков.