对前端和管理路由器使用相同的Magento路由frontname
我发现了Magento路由逻辑的问题,我想看看是否有人可以确认这一点 Magento将路由器堆叠为admin、standard和default,然后一次处理一个路由器。Magento根据URL获取当前模块名称(请参阅对前端和管理路由器使用相同的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的匹配情况检查模块是否应由此路由器处理。如果找到匹配项,它将对其进行路由。如果没有,它将继续到下一个路由器
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
我的路线
这意味着,如果您的前端路由器与管理路由器使用相同的名称,则管理路由器将始终首先匹配,即使在前端页面上也是如此。现在,您的前端页面将使用adminbase\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。管理员看起来是一样的,因为模块的控制器扩展了