Verwenden reservierter Wörter in Magento 2-URLs

11

Ist es möglich, in Magento 2 ein Modul mit Standard-Routing zu erstellen, das auf eine URL in Form von reagiert?

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

Das heißt - eine URL, bei der der zweite Parameter ein für PHP reserviertes Schlüsselwort ist. Das Problem mit dem oben genannten ist, einen PHP-Controller-Klassennamen zu erstellen, der

Namespace\Module\Controller\Return\Index

und Returnim Namespace zu haben ist illegales PHP. Ich weiß, ob der letzte Parameter der URL (traditionell als Aktion bezeichnet) ein reserviertes Schlüsselwort war

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

Mit Magento würde ich eine Controller-Klasse mit dem Namen erstellen

Namespace\Module\Controller\Foo\ReturnAction

Dies funktioniert jedoch nicht für den zweiten Parameter.

Gibt es eine Möglichkeit, dies mit Standard-Magento 2-Routing-Techniken zu tun?

Wenn nicht, gibt es eine allgemein als bewährte Methode zum Injizieren eines benutzerdefinierten Routerobjekts, um dieses Verhalten zu erhalten, oder eine andere Technik, mit der ich dies umgehen kann? (ein afterPlugin an Magento\Framework\App\Router\ActionList?)

Alan Storm
quelle

Antworten:

7

Am Ende habe ich ein Plugin für hinzugefügt 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>

und dann mit dem $namespaceParameter der getMethode herumgespielt

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

Dies gab mir einen Klassennamen von

Package\Module\Controller\ReturnAction\Index

Ich bin mir nicht sicher, wie gut diese Idee ist, also hüte dich vor dem Käufer usw.

Alan Storm
quelle
Das sieht gut und einfach aus. Insbesondere, weil es auf die gleiche Weise auf alle PHP-reservierten Wörter erweitert werden kann, werden die Aktionsnamen Aktionsklassen zugeordnet. Eine Alternative wäre, einen benutzerdefinierten Router zu erstellen , dies erfordert jedoch viel mehr Code.
Marius
2
Nur ein paar Kommentare: 1) Dadurch wird der Namespace für jedes Modul geändert, das versucht, den 'return'-Controller zu verwenden. Sofern Sie nicht absichtlich einen 'catchall' erstellen, ist es möglicherweise am besten, den Parameter $ module so zu überprüfen, dass er mit Ihrem eigenen Modul übereinstimmt. 2) Wenn wir versuchen wollen, die Namensparität beizubehalten, sollte der zurückgegebene $ -Namensraum wahrscheinlich 'returnController' sein - der dann nach dem ReturnController-Namespace / Dateipfad suchen würde. Dies würde dann geladen \Namespace\Module\Controller\ReturnController\Index- was genauer ist.
Jeremy Rimpo