Usando palavras reservadas em URLs do Magento 2

11

É possível criar um módulo no Magento 2, usando roteamento padrão, que responda a uma URL na forma de

http://magento.example.com/namespace_module/return/index

Ou seja - uma URL em que o segundo parâmetro é uma palavra-chave reservada em PHP. O problema com o exposto acima é criar um nome de classe de controlador PHP que seja

Namespace\Module\Controller\Return\Index

e ter Returnno espaço para nome é PHP ilegal. Sei que o parâmetro final do URL (tradicionalmente chamado de ação) era uma palavra-chave reservada

http://magento.example.com/namespace_module/foo/return

que o Magento me deixaria criar uma classe de controlador chamada

Namespace\Module\Controller\Foo\ReturnAction

No entanto, isso não funciona para o segundo parâmetro.

Existe uma maneira de fazer isso usando técnicas padrão de roteamento Magento 2?

Caso contrário, existe uma prática recomendada geralmente considerada para injetar um objeto roteador personalizado para obter esse comportamento ou alguma outra técnica que me permita solucionar esse problema? (um afterplugin ativado Magento\Framework\App\Router\ActionList?)

Alan Storm
fonte

Respostas:

7

Acabei adicionando um plugin para Magento\Framework\App\Router\ActionList

<!-- File: app/code/Package/Namespace/etc/di.xml -->
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <type name="Magento\Framework\App\Router\ActionList">
        <plugin name="package_module_magento_framework_app_router_actionlist" type="Package\Module\Plugin\Magento\Framework\App\Router\ActionList"/>
    </type>
</config>

e depois brincou com o $namespaceparâmetro do getmétodo

#File: app/code/Package/Module/Plugin/Magento/Framework/App/Router/ActionList.php
public function beforeGet($subject, $module, $area, $namespace, $action)
{
    if($namespace === 'return')
    {
        $namespace = 'returnaction';
    }
    return [$module, $area, $namespace, $action];
}

Isso me deu um nome de classe de

Package\Module\Controller\ReturnAction\Index

Não tenho certeza de quão boa é essa ideia, portanto, cuidado com o comprador, etc.

Alan Storm
fonte
Parece bom e fácil. Especialmente porque pode ser estendido a todas as palavras reservadas em php da mesma maneira que os nomes das ações são mapeados para as classes de ação. Uma alternativa seria criar um roteador personalizado, mas isso requer muito mais código.
Marius
2
Apenas alguns comentários: 1) Isso alterará o espaço para nome de qualquer módulo que tente usar o controlador 'return'. A menos que você intencionalmente crie um 'catchall', talvez seja melhor verificar o parâmetro $ module para corresponder ao seu próprio módulo. 2) Se tentarmos preservar a paridade de nomenclatura, o espaço para nome $ retornado provavelmente deve ser 'returnController' - que procuraria o espaço para nome / caminho do arquivo ReturnController. Isso seria carregado \Namespace\Module\Controller\ReturnController\Index- o que é mais preciso.
Jeremy Rimpo