У попередньому уроці ми розглянули на практиці процес створення простого модуля на платформі Magento 2. Цей урок є його доповненням, і сьогодні ми розглянемо практичні моменти зі створення простого контролера і екшена (дії) в Magento 2.
Перейдіть в папку app/code і створіть в ній папку {VENDOR} – в нашому випадку це Sebweo, а в ній папку {MODULE} – в нашому випадку це Test. {VENDOR} – це «виробник» модуля; використовуйте назву своєї компанії. {MODULE} – це назва модуля.
Потім створіть папки Controller і etc в папці Test.
Простір імен:
Ваш модуль знаходиться в просторі імен Sebweo. Саме в цій папці ви будете “зберігати” модулі, які будете створювати. Використовуйте для своїх модулів свій власний простір імен.
ВАЖЛИВО: не редагуйте «основні» файли Magento 2, тобто в папці app/code/Magento (або в vendor/magento/), оскільки це може призвести до помилок при спробі оновлення платформи.
Тепер, коли ви створили основний «каркас» вашого модуля, ви повинні «оголосити» його в платформі 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.
В папці app/code/Sebweo/Test/Controller створіть папку Perevirka, а в ній створіть файл Index.php з таким вмістом:
<?php
namespace Sebweo\Test\Controller\Perevirka;
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 це забороняють. Це можна використовувати тільки тимчасово, і тільки для тестових цілей.
Щоб отримати доступ до модуля через зовнішній інтерфейс (фронтенд), ви повинні створити маршрут для вашого модуля. Якщо вам потрібно отримати доступ до модуля по URL {DOMEN}/testuvannya/, ви повинні створити папку 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="testuvannya"> <module name="Sebweo_Test" /> </route> </router> </config>
Ми використовуємо «стандартний» (standard) маршрутизатор, який забезпечує доступ до зовнішньої частини нашого модуля. Крім цього ще є маршрутизатори: robots, urlrewrite, cms і default. В якості ідентифікатора маршрутизатора (route id) потрібно використовувати унікальне значення, це може бути, наприклад, {vendor_module}. Значення в ноді frontName використовується в URL для доступу до контролера в зовнішньому інтерфейсі, тобто, є частиною посилання.
Деякі зауваження по організації контролерів
Шлях до контролера по URL має такий вигляд:
{DOMEN}/path/controller/index/
де:
path – значення ноду frontNamecontroller – назва папки контролера (в нижньому регістрі)index – назва файлу дії контролера (екшену) (в нижньому регістрі)
У нашому прикладі посилання буде мати наступний вигляд:
{DOMEN}/testuvannya/perevirka/index/
Дія з ім’ям index – це дія, яку Magento виконає за замовчуванням, якщо ви не вкажете дію в URL. Тобто, наше посилання може мати й такий вигляд:
{DOMEN}/testuvannya/perevirka/
Відкривши обидва ці посилання, ви побачите текст Вітаю, світ!, тобто, результат виконання дії в контролері.
Якщо вам потрібна інша дія (не index), наприклад, View, вам потрібно створити файл View.php в папці Perevirka з таким вмістом:
<?php
namespace Sebweo\Test\Controller\Perevirka;
class View extends \Magento\Framework\App\Action\Action
{
public function execute()
{
echo 'Вітаю, світ (знову)!';
exit();
}
}
Якщо ви відкриєте URL:
{DOMEN}/testuvannya/perevirka/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. Прийміть наші вітання!
До наступних уроків.
WordPress роками був неперевершеним "монолітом": він відповідав і за зручну адмін-панель, і за збереження даних,…
У світі веб-серверів часто говорять про протистояння Nginx vs Apache. Але що, якби я сказав…
Коли я починав свій шлях у веб-розробці, питання "який веб-сервер використовувати?" практично не стояло. Відповідь…
Коли мова заходить про веб-сервери, два імені завжди на слуху: Apache та Nginx. Apache —…
У світі веб-розробки ми постійно стикаємося з проблемою: "А в мене на комп'ютері все працює!".…
На зорі моєї кар'єри веб-розробника все було відносно просто: встановив локальний сервер (пам'ятаєте Denwer?), поклав…