Utiliser des mots réservés dans les URL Magento 2

11

Est-il possible de créer un module dans Magento 2, en utilisant un routage standard, qui répond à une URL sous la forme de

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

C'est-à-dire une URL où le deuxième paramètre est un mot-clé PHP réservé. Le problème avec ce qui précède est de créer un nom de classe de contrôleur PHP qui

Namespace\Module\Controller\Return\Index

et avoir Returndans l'espace de noms est illégal PHP. Je sais si le dernier paramètre de l'URL (traditionnellement appelé l'action) était un mot clé réservé

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

que Magento me laisserait créer une classe de contrôleur nommée

Namespace\Module\Controller\Foo\ReturnAction

Cependant, cela ne fonctionne pas pour le deuxième paramètre.

Existe-t-il un moyen de le faire en utilisant les techniques de routage standard de Magento 2?

Sinon, existe-t-il une meilleure pratique généralement considérée pour injecter un objet routeur personnalisé pour obtenir ce comportement, ou une autre technique qui me permettrait de contourner ce problème? (un afterplugin sur Magento\Framework\App\Router\ActionList?)

Alan Storm
la source

Réponses:

7

J'ai fini par ajouter un plugin pour 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>

puis manipulé le $namespaceparamètre de la getméthode

#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];
}

Cela m'a donné un nom de classe de

Package\Module\Controller\ReturnAction\Index

Je ne sais pas à quel point c'est une bonne idée, alors acheteur, méfiez-vous, etc.

Alan Storm
la source
Cela semble agréable et facile. Surtout parce qu'il peut être étendu à tous les mots réservés php de la même manière que les noms d'actions sont mappés aux classes d'actions. Une alternative serait de créer un routeur personnalisé mais cela nécessite beaucoup plus de code.
Marius
2
Quelques commentaires seulement: 1) Cela changera l'espace de noms pour tout module qui essaie d'utiliser le contrôleur «retour». Sauf si vous créez intentionnellement un `` catchall '', il peut être préférable de vérifier le paramètre $ module pour correspondre à votre propre module. 2) Si nous essayons de préserver la parité de nommage, l'espace de noms $ retourné devrait probablement être «returnController» - qui rechercherait alors l'espace de noms / chemin de fichiers ReturnController. Cela se chargerait alors \Namespace\Module\Controller\ReturnController\Index- ce qui est plus précis.
Jeremy Rimpo