Как создать простой контроллер и действие в 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. Примите наши поздравления!
До следующих уроков.