Маршруты
Маршрут сообщает Magento, какой модуль отвечает за адреса с определённым началом. В отличие от многих фреймворков, здесь не перечисляют каждую страницу: модуль получает одно слово в адресе, а остальное Magento находит по именам папок и классов.
Где лежит файл
Маршруты витрины описывают в файле etc/frontend/routes.xml модуля. Папка frontend означает область витрины. Файл создают вручную.
app/code/Acme/Hello/
├── registration.php
└── etc/
├── module.xml
└── frontend/
└── routes.xml новый файлФайл routes.xml
<?xml version="1.0"?>
<!-- app/code/Acme/Hello/etc/frontend/routes.xml -->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd">
<router id="standard">
<route id="hello" frontName="hello">
<module name="Acme_Hello"/>
</route>
</router>
</config>Теперь все адреса, начинающиеся с /hello, Magento передаёт модулю Acme_Hello. После создания файла сбросьте кеш: bin/magento cache:clean. Сама страница пока вернёт ошибку 404 — у модуля ещё нет действия, оно появится в следующем уроке.
| Атрибут | Что означает |
|---|---|
router id="standard" | Маршрут витрины; для панели управления пишут admin |
route id | Внутреннее имя маршрута; используется в именах макетов |
frontName | Первая часть адреса |
Обычно id и frontName делают одинаковыми.
Из чего состоит адрес
Адрес в Magento состоит из трёх частей: frontName/контроллер/действие. Вторая часть — папка внутри Controller, третья — класс в этой папке.
| Адрес | Класс в модуле |
|---|---|
/hello/index/index | Controller\Index\Index |
/hello/review/view | Controller\Review\View |
/hello/review | Controller\Review\Index |
/hello | Controller\Index\Index |
Пропущенная часть заменяется словом index. Поэтому /hello и /hello/index/index — одна и та же страница.
Параметры в адресе
После трёх частей можно дописать параметры парами «имя/значение»:
/hello/review/view/id/5Действие получит параметр id со значением 5. Тот же параметр можно передать привычным способом: /hello/review/view?id=5.
Ссылка на свою страницу
Адрес не пишут в шаблоне руками — его строит метод getUrl():
<!-- любой шаблон .phtml -->
<a href="<?= $escaper->escapeUrl($block->getUrl('hello/review/view', ['id' => 5])) ?>">Отзыв</a>Метод вернёт полный адрес вида http://shop.test/hello/review/view/id/5/ с учётом текущей витрины. В классах PHP то же делает Magento\Framework\UrlInterface с тем же методом getUrl().
Частая ошибка
Для frontName выбрали слово, занятое ядром: catalog, customer, checkout. Модуль начинает перехватывать чужие адреса, либо его страницы не открываются. Берите слово, которое точно принадлежит вашему модулю, а после правки routes.xml не забывайте bin/magento cache:clean.