Używanie słów zastrzeżonych w adresach URL Magento 2

11

Czy można stworzyć moduł w Magento 2, używając standardowego routingu, który odpowiada na adres URL w postaci

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

To znaczy - adres URL, w którym drugim parametrem jest słowo kluczowe zastrzeżone dla PHP. Problem z powyższym polega na tym, że należy utworzyć nazwę klasy kontrolera PHP

Namespace\Module\Controller\Return\Index

a posiadanie Returnw przestrzeni nazw jest nielegalne PHP. Wiem, czy końcowy parametr adresu URL (tradycyjnie nazywany akcją) był słowem kluczowym zastrzeżonym

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

że Magento pozwoli mi stworzyć klasę kontrolera o nazwie

Namespace\Module\Controller\Foo\ReturnAction

Nie działa to jednak w przypadku drugiego parametru.

Czy można to zrobić za pomocą standardowych technik routingu Magento 2?

Jeśli nie, to czy istnieje ogólnie uważana najlepsza praktyka wstrzykiwania niestandardowego obiektu routera w celu uzyskania takiego zachowania, czy też inna technika, która pozwoliłaby mi to obejść? ( afterwtyczka włączona Magento\Framework\App\Router\ActionList?)

Alan Storm
źródło

Odpowiedzi:

7

W końcu dodałem wtyczkę do 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>

a następnie bawił się $namespaceparametrem getmetody

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

To dało mi klasową nazwę

Package\Module\Controller\ReturnAction\Index

Nie jestem pewien, jak dobry jest to pomysł, więc kupujący strzeż się itp.

Alan Storm
źródło
To wygląda ładnie i łatwo. Zwłaszcza, że ​​można go rozszerzyć na wszystkie słowa zastrzeżone php w taki sam sposób, w jaki nazwy akcji są mapowane na klasy akcji. Alternatywą byłoby utworzenie niestandardowego routera, ale wymaga to znacznie więcej kodu.
Marius
2
Tylko kilka komentarzy: 1) Spowoduje to zmianę przestrzeni nazw dla każdego modułu, który próbuje użyć kontrolera „return”. O ile celowo nie tworzysz „catchall”, najlepiej sprawdzić parametr $ module, aby dopasować go do własnego modułu. 2) Jeśli będziemy próbować zachować parytet nazw, zwróconą przestrzenią nazw $ prawdopodobnie powinien być „returnController” - która wówczas szukałaby przestrzeni nazw / ścieżki ReturnController. To by następnie załadowało \Namespace\Module\Controller\ReturnController\Index- co jest bardziej dokładne.
Jeremy Rimpo