Menggunakan Kata-kata yang Dicadangkan dalam URL Magento 2

11

Apakah mungkin untuk membuat modul di Magento 2, menggunakan perutean standar, yang merespons URL dalam bentuk

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

Yaitu - URL tempat parameter kedua adalah kata kunci milik PHP. Masalah dengan hal di atas adalah membuat nama kelas kontroler PHP itu

Namespace\Module\Controller\Return\Index

dan memiliki Returndalam namespace adalah PHP ilegal. Saya tahu jika parameter akhir URL (biasanya disebut tindakan) adalah kata kunci yang dipesan

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

bahwa Magento akan membiarkan saya membuat kelas pengontrol bernama

Namespace\Module\Controller\Foo\ReturnAction

Namun, ini tidak berfungsi untuk parameter kedua.

Apakah ada cara untuk melakukan ini menggunakan teknik routing Magento 2 standar?

Jika tidak, apakah ada praktik umum yang dianggap terbaik untuk menyuntikkan objek router khusus untuk mendapatkan perilaku ini, atau teknik lain yang memungkinkan saya mengatasi ini? (sebuah afterplugin aktif Magento\Framework\App\Router\ActionList?)

Alan Storm
sumber

Jawaban:

7

Saya akhirnya menambahkan plugin untuk 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>

dan kemudian mengutak-atik $namespaceparameter getmetode

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

Ini memberi saya nama kelas

Package\Module\Controller\ReturnAction\Index

Tidak yakin seberapa bagus ide ini, jadi pembeli berhati-hatilah, dll.

Alan Storm
sumber
Ini terlihat bagus dan mudah. Khususnya karena itu dapat diperluas ke semua kata-kata yang dilindungi php dengan cara yang sama nama tindakan dipetakan ke kelas tindakan. Alternatifnya adalah membuat router kustom tetapi ini membutuhkan cara kode lebih banyak.
Marius
2
Hanya beberapa komentar: 1) Ini akan mengubah namespace untuk setiap modul yang mencoba menggunakan pengontrol 'kembali'. Kecuali Anda sengaja membuat 'catchall', mungkin lebih baik untuk memeriksa parameter $ module agar sesuai dengan modul Anda sendiri. 2) Jika kita akan mencoba mempertahankan paritas penamaan, $ namespace yang dikembalikan mungkin harus 'returnController' - yang kemudian akan mencari namespace / filepath ReturnController. Ini kemudian akan memuat \Namespace\Module\Controller\ReturnController\Index- yang lebih akurat.
Jeremy Rimpo