Configurando uma rota administrativa no Magento 2

15

Olhando para o código principal do Magento 2, parece haver duas maneiras de configurar uma rota de administrador.

O primeiro

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

é semelhante ao Magento 1. Você adiciona seu módulo a uma lista de módulos na adminhtmlrota e o Magento verifica para você.

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

você configurou uma nova rota (id cmsacima) e depois adicionou seu módulo a ela.

Uma dessas é a maneira "certa / preferida" de fazer isso no Magento 2? Se não, qual é a diferença entre os dois? ou seja, quando você usaria um sobre o outro?

Pedindo não para resolver um problema específico, mas para ter certeza de que estou criando minhas rotas da maneira correta e que problemas semelhantes aos módulos Magento 1 (puxando bibliotecas ajax, segurança etc.) sejam evitados.

Alan Storm
fonte

Respostas:

23

A diferença está nos URLs. O URL tem a seguinte estrutura: <areaFrontName>/<moduleFrontName>/<actionPath>/<actionName>

A rota "Adminhtml" possui moduleFrontName "admin", o mesmo que areaFrontName. Portanto, todos os caminhos na rota "adminhtml" serão iniciados admin/admin.

Se você quiser ter um URL mais específico, use uma rota específica, como o catálogo faz. Todos os URLs do catálogo começam com admin/catalog. Esta é a maneira preferida.

A configuração preferida é:

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

Note que before="Magento_Backend"não é necessário

Anton Kril
fonte
3
existem explicações sobre nomear ID e frontName? deve ser o mesmo para a área de administração? deve usar o nome do módulo? por que não está funcionando quando id! = frontName?
Sergey Korzhov 28/07
4

Eu me deparei com isso também, procurando exemplos de como adicionar um controlador adminhtml. Eu fiz algumas pesquisas e é isso que eu encontrei.

O route id="adminhtml"caminho é usado 24 vezes no núcleo.

O before="Magento_Backend"caminho é usado 31 vezes no núcleo.

Existem apenas 50 módulos com um adminhtml / routes.xml, mas 24 + 31 = 55. Dica # 1.

Tentei encontrar um denominador comum entre que tipo de módulo usa esse tipo, mas não consigo identificar nenhum. Então, talvez a mudança tenha sido introduzida em um determinado momento, então verifiquei o momento dos dois tipos. Infelizmente, isso foi bastante difícil, pois a maioria deles foi editada pela última vez em meados de setembro para apresentar as novas urnas, então eu tive que usar a função de história do Github.

Notei que alguns arquivos routes.xml em que a route id="adminhtml"opção é usada também usam o before="Magento_Backend", veja, por exemplo, o arquivo routes.xml do Magento_UrlRewrite . Não consigo encontrar nenhuma semelhança conclusiva entre as três variantes.

Também verifiquei os novos módulos (que não estavam no M1 e, portanto, não podiam ser portados, mas foram escritos como novos para o M2), como AdvancedPricingImportExport , Integration , MediaStorage e EncryptionKey e, embora alguns usem o before="Magento_Backend"e outros não, todos usam a <route id="adminhtml">tag. Entre esses, os sem o before="Magento_Backend"foram alterados pela última vez em fevereiro de 2015, enquanto os com essa tag foram todos editados após essa data.

Portanto, minha conclusão preliminar é que esta é a maneira preferida de fazê-lo (decidido explicitamente internamente no QG do Magento ou não);

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

Eu adoraria ouvir a posição do desenvolvedor central do Magento sobre isso, obviamente.

ATUALIZAÇÃO: Anton Kril respondeu, veja sua resposta para a maneira preferida de fazer isso.

Peter Jaap Blaakmeer
fonte