Utilizzo di parole riservate negli URL di Magento 2


11

È possibile creare un modulo in Magento 2, utilizzando il routing standard, che risponde a un URL sotto forma di

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

Cioè - un URL in cui il secondo parametro è una parola chiave riservata PHP. Il problema con quanto sopra è creare un nome classe controller PHP che sia

Namespace\Module\Controller\Return\Index

e avere Returnnello spazio dei nomi è PHP illegale. So se il parametro finale dell'URL (tradizionalmente chiamato azione) era una parola chiave riservata

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

che Magento mi avrebbe permesso di creare una classe controller denominata

Namespace\Module\Controller\Foo\ReturnAction

Tuttavia, questo non funziona per il secondo parametro.

Esiste un modo per farlo utilizzando le tecniche di routing Magento 2 standard?

In caso contrario, esiste una best practice generalmente considerata per l'iniezione di un oggetto router personalizzato per ottenere questo comportamento o qualche altra tecnica che mi consenta di aggirare il problema? (un afterplug-in attivo Magento\Framework\App\Router\ActionList?)

Risposte:


7

Ho finito per aggiungere un plugin per 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 poi armeggiato con il $namespaceparametro del getmetodo

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

Questo mi ha dato un nome di classe di

Package\Module\Controller\ReturnAction\Index

Non sono sicuro di quanto sia buona l'idea, quindi fai attenzione al compratore, ecc.


Questo sembra carino e facile. Soprattutto perché può essere esteso a tutte le parole riservate di php nello stesso modo in cui i nomi delle azioni sono associati a classi di azioni. Un'alternativa sarebbe quella di creare un router personalizzato ma ciò richiede molto più codice.
Marius

2
Solo un paio di commenti: 1) Questo cambierà lo spazio dei nomi per qualsiasi modulo che tenta di usare il controller 'return'. A meno che tu non stia creando intenzionalmente un 'catchall', potrebbe essere meglio controllare il parametro $ module per abbinare il tuo modulo. 2) Se proveremo a preservare la parità dei nomi, lo spazio dei nomi $ restituito dovrebbe probabilmente essere 'returnController' - che quindi cercherebbe lo spazio dei nomi / percorso ReturnController. Questo verrebbe quindi caricato \Namespace\Module\Controller\ReturnController\Index, il che è più preciso.
Jeremy Rimpo,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.