7

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

Magento 将路由器 admin、standard 和 default 堆叠起来,一次处理一个。Magento 根据 URL 获取当前模块名称(请参阅Mage_Core_Controller_Varien_Router_Standard::match()),然后根据与 Magento 配置中的 frontName 的匹配项检查模块是否应由该路由器处理。如果找到匹配项,则路由它。如果没有,它继续到下一个路由器。

配置摘录:

    <管理员>
        <路由器>
            <我的路线>
                <使用>管理员</使用>
                <参数>
                    <module>MyNamespace_MyModule</module>
                    <frontName>我的路线</frontName>
                </args>
            </myroute>
        </路由器>
    </admin>
    <前端>
        <路由器>
            <我的路线>
                <使用>管理员</使用>
                <参数>
                    <module>MyNamespace_MyModule</module>
                    <frontName>我的路线</frontName>
                </args>
            </myroute>
        </路由器>
    </前端>
    

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

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

谁能在这里确认我对路由器逻辑的评估是正确的?

4

3 回答 3

4

您可能还想查看 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_Controller_Request_Http $request)中被调用collectRoutes($configArea, $useRouterName)$useRouterName有时会返回admin,也会返回standard前端请求。这个假设听起来是正确的,因为这完全取决于 magento 如何 在同一个类中构建和堆叠私有数组_routes:._modulesMage_Core_Controller_Varien_Router_Standard

我相信在这种情况下,您可能希望将<use>节点指定standard为前端和admin管理员,或者重写<global>节点中的控制器操作。

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

和/或使用X-debug逐步执行逻辑。

甚至 Alan Storm 在他的文章中写道,用于前端和后端的相同路由器不应相同。

因此,如果出于某种原因,存储模型对象认为其处于管理模式,则此方法似乎可以确保标准路由器对象保释。像标准/管理员路由器关系一样,存储对象是另一个指向 Magento 开发过程的某些部分的东西.

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

于 2012-05-07T22:42:06.380 回答
3

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

于 2012-05-17T04:15:56.710 回答
1

只是把我的 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>

我猜使用一个独特的名字是有意义的!

于 2013-06-20T21:08:07.697 回答