Configurar una ruta de administrador en Magento 2

15

Mirando el código central de Magento 2, parece que hay dos formas de configurar una ruta de administrador.

El primero

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

es similar a Magento 1. Agrega su módulo a una lista de módulos en la adminhtmlruta, y Magento lo comprueba por usted.

El segundo

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

tiene que configurar una nueva ruta (id cmsarriba) y luego agregarle su módulo.

¿Es una de estas la forma "correcta / preferida" de hacer esto en Magento 2? Si no, ¿cuál es la diferencia entre los dos? es decir, ¿cuándo usarías uno sobre el otro?

Pidiendo no resolver un problema específico, pero para asegurarme de que estoy creando mis rutas de la manera correcta y que se evitan problemas similares a los módulos de Magento 1 (extracción de bibliotecas ajax, seguridad, etc.).

Alan Storm
fuente

Respuestas:

23

La diferencia está en las URL. Url tiene la siguiente estructura: <areaFrontName>/<moduleFrontName>/<actionPath>/<actionName>

La ruta "Adminhtml" tiene moduleFrontName "admin", igual que areaFrontName. Entonces, todas las rutas en la ruta "adminhtml" comenzarán con admin/admin.

Si desea tener una URL más específica, debe usar una ruta específica, como lo hace el catálogo. Las URL del catálogo comienzan con admin/catalog. Esta es la forma preferida.

La configuración preferida es:

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

Tenga en cuenta que before="Magento_Backend"no es necesario

Anton Kril
fuente
3
¿Hay alguna explicación sobre la identificación de nombres y frontName? ¿debería ser lo mismo para el área de administración? debería usar el nombre del módulo? ¿Por qué no funciona cuando id! = frontName?
Sergey Korzhov
4

Me encontré con esto también mientras buscaba ejemplos de cómo agregar un controlador adminhtml. Investigué un poco y esto es lo que he encontrado.

El route id="adminhtml"camino se usa 24 veces en el núcleo.

El before="Magento_Backend"camino se usa 31 veces en el núcleo.

Solo hay 50 módulos con adminhtml / routes.xml pero 24 + 31 = 55. Sugerencia n. ° 1.

Traté de encontrar un denominador común entre qué tipo de módulos usa cada tipo, pero parece que no puedo identificar ninguno. Entonces, tal vez el cambio se introdujo en un momento determinado, así que verifiqué la sincronización de los dos tipos. Desafortunadamente, esto fue bastante difícil ya que la mayoría de ellos fueron editados por última vez a mediados de septiembre para presentar las nuevas urnas, así que tuve que usar la función de historia de Github.

Luego noté que algunos archivos routes.xml donde route id="adminhtml"se usa la opción también usan el before="Magento_Backend", vea por ejemplo el archivo routes.xml de Magento_UrlRewrite . Parece que no puedo encontrar ninguna coincidencia concluyente entre las tres variantes.

También verifiqué los nuevos módulos (que no estaban en M1 y, por lo tanto, no se podían portar, pero se escribieron nuevos para M2), como AdvancedPricingImportExport , Integration , MediaStorage y EncryptionKey y aunque algunos usan el before="Magento_Backend"y otros no, todos usan la <route id="adminhtml">etiqueta Entre estos, los que no before="Magento_Backend"tenían el último se cambiaron en febrero de 2015, mientras que los que tenían esa etiqueta se editaron después de esa fecha.

Entonces, mi conclusión preliminar es que esta es la forma preferida de hacerlo (ya sea explícitamente decidido internamente en Magento HQ o no);

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

Me encantaría escuchar la posición del desarrollador principal de Magento sobre esto, obviamente.

ACTUALIZACIÓN: Anton Kril respondió, vea su respuesta para la forma preferida de hacer esto.

Peter Jaap Blaakmeer
fuente