Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Маршруты

Маршрут сообщает 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/indexController\Index\Index
/hello/review/viewController\Review\View
/hello/reviewController\Review\Index
/helloController\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.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.