Uso de palabras reservadas en las URL de Magento 2

11

¿Es posible crear un módulo en Magento 2, utilizando enrutamiento estándar, que responda a una URL en forma de

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

Es decir, una URL donde el segundo parámetro es una palabra clave reservada de PHP. El problema con lo anterior es crear un nombre de clase de controlador PHP que sea

Namespace\Module\Controller\Return\Index

y tener Returnen el espacio de nombres es PHP ilegal. Sé si el parámetro final de la URL (tradicionalmente llamado la acción) era una palabra clave reservada

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

que Magento me dejaría crear una clase de controlador llamada

Namespace\Module\Controller\Foo\ReturnAction

Sin embargo, esto no funciona para el segundo parámetro.

¿Hay alguna manera de hacer esto usando las técnicas de enrutamiento estándar de Magento 2?

Si no, ¿existe una práctica recomendada generalmente considerada para inyectar un objeto de enrutador personalizado para obtener este comportamiento, o alguna otra técnica que me permita solucionar esto? (¿un aftercomplemento activado Magento\Framework\App\Router\ActionList?)

Alan Storm
fuente

Respuestas:

7

Terminé agregando un complemento 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>

y luego jugueteó con el $namespaceparámetro del 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];
}

Esto me dio un nombre de clase de

Package\Module\Controller\ReturnAction\Index

No estoy seguro de cuán buena es esta idea, así que el comprador tenga cuidado, etc.

Alan Storm
fuente
Esto se ve bien y fácil. Especialmente porque se puede extender a todas las palabras reservadas de php de la misma manera que los nombres de acción se asignan a clases de acción. Una alternativa sería crear un enrutador personalizado, pero esto requiere mucho más código.
Marius
2
Solo un par de comentarios: 1) Esto cambiará el espacio de nombres para cualquier módulo que intente usar el controlador 'return'. A menos que esté creando intencionalmente un 'catchall', podría ser mejor verificar el parámetro $ module para que coincida con su propio módulo. 2) Si vamos a tratar de preservar la paridad de nombres, el espacio de nombres $ devuelto probablemente debería ser 'returnController', que luego buscaría el espacio de nombres / ruta de archivo ReturnController. Esto se cargaría \Namespace\Module\Controller\ReturnController\Index, lo que es más preciso.
Jeremy Rimpo