对前端和管理路由器使用相同的Magento路由frontname

对前端和管理路由器使用相同的Magento路由frontname,magento,routing,Magento,Routing,我发现了Magento路由逻辑的问题,我想看看是否有人可以确认这一点 Magento将路由器堆叠为admin、standard和default,然后一次处理一个路由器。Magento根据URL获取当前模块名称(请参阅Mage\u Core\u Controller\u Varien\u Router\u Standard::match()),然后根据与Magento配置中frontName的匹配情况检查模块是否应由此路由器处理。如果找到匹配项,它将对其进行路由。如果没有,它将继续到下一个路由器

我发现了Magento路由逻辑的问题,我想看看是否有人可以确认这一点

Magento将路由器堆叠为admin、standard和default,然后一次处理一个路由器。Magento根据URL获取当前模块名称(请参阅
Mage\u Core\u Controller\u Varien\u Router\u Standard::match())
,然后根据与Magento配置中frontName的匹配情况检查模块是否应由此路由器处理。如果找到匹配项,它将对其进行路由。如果没有,它将继续到下一个路由器

配置摘录: <admin> <routers> <myroute> <use>admin</use> <args> <module>MyNamespace_MyModule</module> <frontName>myroute</frontName> </args> </myroute> </routers> </admin> <frontend> <routers> <myroute> <use>admin</use> <args> <module>MyNamespace_MyModule</module> <frontName>myroute</frontName> </args> </myroute> </routers> </frontend> 管理 MyNamespace\u MyModule 我的路线 管理 MyNamespace\u MyModule 我的路线

这意味着,如果您的前端路由器与管理路由器使用相同的名称,则管理路由器将始终首先匹配,即使在前端页面上也是如此。现在,您的前端页面将使用admin
base\u url
,按管理员页面的方式进行路由,这可能与您商店的url不同,从而导致中断重定向

请注意,在管理基URL与前端基URL相同的Magento实例中,此问题并不明显


有人能确认我对路由器逻辑的评估是正确的吗?

您可能还需要查看Varien/router/Standard.php,尤其是:

/**
 * checking if this admin if yes then we don't use this router
 *
 * @return bool
 */
protected function _beforeModuleMatch()
{
    if (Mage::app()->getStore()->isAdmin()) {
        return false;
    }
    return true;
}
这在方法
match(Zend\u Controller\u Request\u Http$Request)
中调用,以及
collectRoutes($configArea,$useRouterName)
中调用,因为
$useRouterName
有时会返回
admin
,对于前端请求也会返回
standard
。这一假设听起来是正确的,因为它完全取决于magento如何在同一类中构建和堆叠
\u路由
\u模块
专用阵列:
Mage\u核心控制器\u Varien\u路由器\u标准

我相信在这种情况下,您会希望将
节点指定为
标准
用于前端,将
管理指定为管理,或者在
节点中重写控制器操作

我认为你最好的选择是仔细阅读:

和/或使用单步执行逻辑

就连艾伦·斯托姆(Alan Storm)在他的文章中也写道,用于前端和后端的相同路由器不应该是相同的

因此,如果由于某种原因,存储模型对象认为它处于管理模式,那么这个方法看起来是为了确保标准路由器对象退出。与标准/管理路由器关系一样,store对象是指向Magento开发过程中的某些部分的另一个对象,这些部分首先集中在前端应用程序上,然后在管理控制台上附加,并且必须支持端口更改

store对象是一个仅适用于前端/购物车应用程序的模型。但是,由于Magento中有太多代码假定store对象存在,因此它需要可供管理控制台应用程序使用。这反过来又会在路由器级别造成麻烦,这就是导致这样的检查的原因。许多抽象层、类/模块之间没有定义的契约,以及由于缺乏测试而产生的对重构的恐惧,都会导致这种情况


这不是Magento bug,但在编写模块或使用第三方代码时需要注意。我已经澄清了问题和决议。本质上,应该始终使用现有的adminhtml路由,而不是创建新的管理路由。这使得管理员中的URL保持一致并避免冲突。感谢艾伦和贾里德帮助我更好地理解Magento路由。

我只想把我的2美分投入其中;今晚我当然注意到了这个问题!我正在构建一个自定义模块,我的config.xml路由器定义如下:

<admin>
    <routers>
        <namespace_module>
            <use>admin</use>
            <args>
                <module>Namespace_Module</module>
                <frontName>namespace_module</frontName>
            </args>
        </namespace_module>
    </routers>
</admin>
<frontend>
    <routers>
        <namespace_module>
            <use>standard</use>
            <args>
                <module>Namespace_Module</module>
                <frontName>namespace_module</frontName>
            </args>
        </namespace_module>
    </routers>
</frontend>

管理
名称空间模块
名称空间模块
标准
名称空间模块
名称空间模块
我在前端遇到404错误,而后端路由器工作正常。我更改了前端名称,瞧:

<admin>
    <routers>
        <namespace_module>
            <use>admin</use>
            <args>
                <module>Namespace_Module</module>
                <frontName>namespace_module</frontName>
            </args>
        </namespace_module>
    </routers>
</admin>
<frontend>
    <routers>
        <namespace_module>
            <use>standard</use>
            <args>
                <module>Namespace_Module</module>
                <frontName>namespace_module_front</frontName>
            </args>
        </namespace_module>
    </routers>
</frontend>

管理
名称空间模块
名称空间模块
标准
名称空间模块
名称空间模块前端

我想使用一个唯一的名字是有意义的

我不能谈论您的具体问题(我不确定我是否完全遵循它),但在Magento中的路由已开始围绕1的想法形成凝胶。为前端模块使用自定义前端名称;2.对管理模块使用frontname“admin”,并使用“modules”标记将控制器添加到管理路由器将查找的控制器。如果你打破这种模式,你会感到痛苦。我在第三方模块中发现了这个问题。它对前端和管理区域使用相同的前端名称。这似乎是一个合理的预期工作,区别在于加载管理存储的URL中的“admin”字符串。问题是前端页面最终被管理路由器加载,导致它使用与前端基本URL不同的管理基本URL。除了命名冲突之外,这两个路由器似乎都能根据配置正常工作。进一步研究后,我意识到模块并不像我想象的那样工作。它完全在管理层之外建立了自己的frontname。管理员看起来是一样的,因为模块的控制器扩展了