Налаштування маршруту адміністратора в 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?
Сергій Коржов

4

Я також натрапив на це, шукаючи приклади, як додати контролер adminhtml. Я провів деякі дослідження, і ось що я знайшов.

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

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

Існує лише 50 модулів з адмініструванням / route.xml, але 24 + 31 = 55. Підказка №1.

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

Потім я помітив, що деякі файли route.xml, де використовується route id="adminhtml"параметр, також використовують файлbefore="Magento_Backend" , див., Наприклад , файл route.xml Magento_UrlRewrite . Я, здається, не можу знайти жодних переконливих спільностей між трьома варіантами.

Я також перевірив нові модулі (яких не було в 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 core Dev щодо цього.

ОНОВЛЕННЯ: Антон Крил відповів, див. Його відповідь щодо кращого способу зробити це.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.