在Magento 2 URL中使用保留字


11

是否可以使用标准路由在Magento 2中创建一个模块,该模块以以下形式响应URL:

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

即-URL,其中第二个参数是PHP保留关键字。上面的问题是创建一个PHP控制器类名

Namespace\Module\Controller\Return\Index

并且Return在命名空间中包含非法的PHP。我知道URL的最终参数(传统上称为action)是否是保留关键字

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

Magento可以让我创建一个名为

Namespace\Module\Controller\Foo\ReturnAction

但是,这不适用于第二个参数。

有没有办法使用标准的Magento 2路由技术来做到这一点?

如果不是,是否存在通常被认为是注入自定义路由器对象以获得此行为的最佳实践,或者是否有其他技术可以帮助我解决此问题?(一个after插件Magento\Framework\App\Router\ActionList?)

Answers:


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)这将更改任何尝试使用“返回”控制器的模块的名称空间。除非您有意创建一个“ catchall”,否则最好检查$ module参数以匹配您自己的模块。2)如果我们要尝试保留命名奇偶校验,则返回的$ namespace可能应该是'returnController'-然后它将搜索ReturnController命名空间/文件路径。然后将加载\Namespace\Module\Controller\ReturnController\Index-更准确。
杰里米·林波'17
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.