Настройка маршрута администратора в Magento 2

15

Глядя на основной код Magento 2, кажется, что есть два способа настройки маршрута администратора.

Первый

#File: vendor/magento/module-media-storage/etc/adminhtml/routes.xml
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd">
    <router id="admin">
        <route id="adminhtml">
            <module name="Magento_MediaStorage" />
        </route>
    </router>
</config>

аналогичен Magento 1. Вы добавляете свой модуль в список модулей в adminhtmlмаршруте, и Magento проверяет его для вас.

Секунда

#File: vendor/magento/module-cms/etc/adminhtml/routes.xml
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd">
    <router id="admin">
        <route id="cms" frontName="cms">
            <module name="Magento_Cms" before="Magento_Backend" />
        </route>
    </router>
</config>

Вам нужно настроить новый маршрут (идентификатор cmsвыше), а затем добавить к нему свой модуль.

Является ли один из них «правильным / предпочтительным» способом сделать это в Magento 2? Если нет, то чем они отличаются? т.е. когда бы вы использовали один поверх другого?

Попросить не решить конкретную проблему, а убедиться, что я создаю свои маршруты правильным образом и что проблем, подобных модулям Magento 1 (использование библиотек ajax, безопасность и т. Д.), Избегают.

Алан Сторм
источник

Ответы:

23

Разница в URL. URL имеет следующую структуру: <areaFrontName>/<moduleFrontName>/<actionPath>/<actionName>

Маршрут "Adminhtml" имеет moduleFrontName "admin", так же, как и areaFrontName. Таким образом, все пути в маршруте "adminhtml" будут начинаться с admin/admin.

Если вы хотите иметь более конкретный URL, вы должны использовать конкретный маршрут, как каталог делает это. Все URL каталога начинаются с admin/catalog. Это предпочтительный способ.

Итак, предпочтительная конфигурация:

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd">
    <router id="admin">
        <route id="cms" frontName="cms">
            <module name="Magento_Cms"/>
        </route>
    </router>
</config>

Обратите внимание, что before="Magento_Backend"не нужно

Антон Криль
источник
3
Есть ли объяснения по поводу именования ID и frontName? должно быть то же самое для админки? это должно использовать имя модуля? почему это не работает, когда id! = frontName?
Сергей Коржов
4

Я тоже сталкивался с этим, когда искал примеры, как добавить контроллер adminhtml. Я провел некоторое исследование, и это то, что я нашел.

route id="adminhtml"Способ используется 24 раз в сердцевине.

before="Magento_Backend"Способ используется 31 раз в ядре.

Есть только 50 модулей с adminhtml / rout.xml, но 24 + 31 = 55. Подсказка # 1.

Я пытался найти общий знаменатель между тем, какой тип модулей использует какой тип, но я не могу определить, какой из них. Так что, возможно, изменение было внесено в определенный момент времени, поэтому я проверил выбор времени для этих двух типов. К сожалению, это было довольно сложно, так как большинство из них были в последний раз отредактированы в середине сентября, чтобы ввести новые урны, поэтому мне пришлось использовать функцию истории Github.

Затем я заметил, что некоторые файлы rout.xml, в которых используется эта route id="adminhtml"опция, также используют before="Magento_Backend", например , файл Magento_UrlRewrite route.xml . Я не могу найти каких-либо убедительных сходств между этими тремя вариантами.

Я также проверил новые модули (которых не было в M1, и поэтому они не могли быть перенесены, но были написаны как новые для M2), такие как AdvancedPricingImportExport , Integration , MediaStorage и EncryptionKey, и хотя некоторые используют, before="Magento_Backend"а некоторые нет, все они используют <route id="adminhtml">тег. Среди них, те, у кого не before="Magento_Backend"было, были в последний раз изменены в феврале 2015 года, а те, у которых был этот тег, были отредактированы после этой даты.

Итак, мой предварительный вывод заключается в том, что это предпочтительный способ сделать это (либо явно решено внутренне в штаб-квартире Magento, либо нет);

<config xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <router id="admin">
        <route id="adminhtml">
            <module name="Your_Extension" before="Magento_Backend"/>
        </route>
    </router>
</config>

Мне бы очень хотелось услышать позицию главного разработчика Magento по этому вопросу.

ОБНОВЛЕНИЕ: Антон Криль ответил, см. Его ответ для предпочтительного способа сделать это.

Питер Яап Блакмер
источник