Використання зарезервованих слів у URL-адресах Magento 2


11

Чи можливо створити модуль в Magento 2, використовуючи стандартну маршрутизацію, яка відповідає на URL у формі

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

Тобто - URL-адреса, де другий параметр є ключовим словом, зарезервованим PHP. Проблема з вищезазначеним полягає в створенні імені класу контролера PHP

Namespace\Module\Controller\Return\Index

а наявність Returnу просторі імен незаконне PHP. Я знаю, якщо кінцевий параметр URL-адреси (традиційно називається дією) був зарезервованим ключовим словом

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

що Magento дозволить мені створити клас контролера з ім'ям

Namespace\Module\Controller\Foo\ReturnAction

Однак це не працює для другого параметра.

Чи можна це зробити за допомогою стандартних методів маршрутизації Magento 2?

Якщо ні, чи існує загальноприйнята найкраща практика введення об'єкта користувальницького маршрутизатора для отримання такої поведінки чи іншої техніки, яка дозволила б мені обійти це? ( afterплагін увімкнено Magento\Framework\App\Router\ActionList?)

Відповіді:


7

Я додав плагін для 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>

а потім співпадає з $namespaceпараметром getметоду

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

Це дало мені назву класу

Package\Module\Controller\ReturnAction\Index

Не впевнений, наскільки це гарна ідея, тому остерігайтеся покупця тощо.


Це виглядає приємно і просто. Спеціально тому, що воно може бути розповсюджено на всі зарезервовані php слова так само, як імена дій відображаються на класи дій. Альтернативою було б створити власний маршрутизатор, але для цього потрібен додатковий код.
Маріус

2
Лише пара зазначає: 1) Це змінить простір імен для будь-якого модуля, який намагається використовувати контролер "return". Якщо ви навмисно не створюєте 'catchall', можливо, найкраще перевірити параметр $ module, щоб він відповідав вашому власному модулю. 2) Якщо ми намагатимемося зберегти паритет імен, повернений простір імен $, ймовірно, повинен бути "returnController" - який би потім шукав простір імен ReturnController / filepath. Потім це завантажиться \Namespace\Module\Controller\ReturnController\Index- що точніше.
Джеремі Рімпо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.