Einrichten einer Admin-Route in Magento 2

15

Betrachtet man den Magento 2-Kerncode, so gibt es anscheinend zwei Möglichkeiten, eine Admin-Route einzurichten.

Der Erste

#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>

ähnelt Magento 1. Sie fügen Ihr Modul einer Liste von Modulen in der adminhtmlRoute hinzu und Magento überprüft es für Sie.

Der Zweite

#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>

Haben Sie eine neue Route eingerichtet (ID cmsoben) und Ihr Modul hinzugefügt?

Ist eine davon die "richtige / bevorzugte" Art, dies in Magento 2 zu tun? Wenn nicht, was ist der Unterschied zwischen den beiden? dh wann würdest du eins übereinander verwenden?

Es wird darum gebeten, ein bestimmtes Problem nicht zu lösen, sondern sicherzustellen, dass meine Routen korrekt erstellt werden und dass Probleme wie bei Magento 1-Modulen (Einlesen von Ajax-Bibliotheken, Sicherheit usw.) vermieden werden.

Alan Storm
quelle

Antworten:

23

Der Unterschied liegt in den URLs. Die URL hat folgende Struktur: <areaFrontName>/<moduleFrontName>/<actionPath>/<actionName>

Route "Adminhtml" hat moduleFrontName "admin", genau wie areaFrontName. Alle Pfade unter "adminhtml" beginnen also mit admin/admin.

Wenn Sie eine spezifischere URL haben möchten, sollten Sie eine spezifische Route verwenden, wie es der Katalog tut. Katalog-URLs beginnen alle mit admin/catalog. Dies ist der bevorzugte Weg.

So bevorzugte Konfiguration ist:

<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>

Beachten Sie, dass dies before="Magento_Backend"nicht erforderlich ist

Anton Kril
quelle
3
Gibt es Erklärungen zur Benennung von ID und Frontname? Sollte es für den Admin-Bereich dasselbe sein? sollte es Modulnamen verwenden? warum funktioniert es nicht wenn id! = frontName?
Sergey Korzhov
4

Ich bin auch darauf gestoßen, als ich nach Beispielen gesucht habe, wie man einen Admin-HTML-Controller hinzufügt. Ich habe ein bisschen recherchiert und das habe ich gefunden.

Der route id="adminhtml"Weg wird im Kern 24 mal benutzt.

Der before="Magento_Backend"Weg wird im Kern 31 mal benutzt.

Es gibt nur 50 Module mit einer adminhtml / routes.xml, aber 24 + 31 = 55. Hinweis # 1.

Ich habe versucht, einen gemeinsamen Nenner zwischen den Modulen zu finden, die welchen Typ verwenden, aber ich kann anscheinend keine identifizieren. Vielleicht wurde die Änderung zu einem bestimmten Zeitpunkt eingeführt, sodass ich das Timing der beiden Typen überprüfte. Leider war dies ziemlich schwierig, da die meisten von ihnen Mitte September zuletzt bearbeitet wurden, um die neuen Urnen vorzustellen, sodass ich Githubs Verlaufsfunktion verwenden musste.

Ich habe dann einige routes.xml Dateien bemerkt , wo die route id="adminhtml"Option verwendet wird , auch die Verwendung before="Magento_Backend", siehe zum Beispiel Magento_UrlRewrite die routes.xml Datei . Ich kann keine schlüssigen Gemeinsamkeiten zwischen den drei Varianten finden.

Ich habe auch die neuen Module (die nicht in M1 waren und daher nicht portiert werden konnte, wurden aber neu für M2 geschrieben), wie AdvancedPricingImportExport , Integration , MediaStorage und EncryptionKey und obwohl einige Verwendung der before="Magento_Backend"und andere nicht, sie alle nutzen das <route id="adminhtml">tag. Unter diesen wurden diejenigen ohne das before="Magento_Backend"letzte Mal im Februar 2015 geändert, während diejenigen mit diesem Tag alle nach diesem Datum bearbeitet wurden .

Meine vorläufige Schlussfolgerung lautet also, dass dies der bevorzugte Weg ist (entweder explizit bei Magento HQ festgelegt oder nicht);

<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>

Ich würde natürlich gerne die Position des Magento-Core-Entwicklers dazu hören.

UPDATE: Anton Kril antwortete, siehe seine Antwort für den bevorzugten Weg, dies zu tun.

Peter Jaap Blaakmeer
quelle