新的 Magento1.13 EE URL 重写如何工作/新的数据库表如何相互关联?

Posted

技术标签:

【中文标题】新的 Magento1.13 EE URL 重写如何工作/新的数据库表如何相互关联?【英文标题】:How does the new Magento1.13 EE URL rewrites work/ How do the new database tables relate to each other? 【发布时间】:2013-06-04 06:11:25 【问题描述】:

我已经使用 Magento 1.13 代码几个小时了,但我无法理解他们对 URL 重写所做的事情。我希望对此进行研究的人可以为我指明正确的方向。

我注意到 core_url_rewrite 不再被使用(或者至少默认情况下它是空的,并且我添加的任何新产品和类别都不会反映在 core_url_rewrite 表中)。相反,它们被添加到新的 enterprise_url_rewrite 表中。

这很简单,但是,我注意到添加了很多其他表(即 enterprise_url_rewrite_category_cl、enterprise_url_rewrite_product_cl、enterprise_url_rewrite_redirect_cl、enterprise_url_rewrite_redirect_rewrite)。我使用 mysql Workbench 对表进行了逆向工程,并得出了以下 EER 图:

上面的 EER 图没有显示 enterprise_url_rewrite_redirect 和 enterprise_url_rewrite 之间的联系,但是(至少我假设)在 enterprise_url_rewrite_redirect_rewrite 表中管理的两者之间存在关系。我的问题是关于其他表的作用。它们每个都有一个 version_id 作为主键和一个 redirect_id 或 entity_id 外键。我假设的 enterprise_url_rewrite_redirect_cl 外键与 enterprise_url_rewrite_redirect 主键有关。

我的第一个问题是这张桌子的用途是什么?我看不出它有什么帮助。我对该表进行了项目范围的搜索,但找不到它的创建位置,更不用说使用了。如果这个问题的答案很明显,请见谅。

我的第二个问题与 enterprise_url_rewrite_product_cl 和 enterprise_url_rewrite_category_cl 表有关。看来这两个表都有entity_ids。我想知道是否有人知道这些 entity_id 可能指的是什么?

我还从代码中注意到访问模型的典型方式已经改变。例如,Enterprise/AdminGws/Model/Controllers.php 的第 781 行代码更改如下:

发件人:

$object = Mage::getModel('core/url_rewrite')->load($id);

收件人:

$object = Mage::getSingleton('core/factory')->getUrlRewriteInstance()->load($id);

现在,来自 Mage_Core_Model_Factory:

const XML_PATH_URL_REWRITE_MODEL = 'global/url_rewrite/model';
. . .
public function getUrlRewriteInstance()

    return $this->getModel($this->getUrlRewriteClassAlias());

. . .
    public function getUrlRewriteClassAlias()

    return (string)$this->_config->getNode(self::XML_PATH_URL_REWRITE_MODEL);

我们看到 XML Path 是 global/url_rewrite/model。如果我们查看匹配的 Config.xml:

    <url_rewrite>
        <model>core/url_rewrite</model>
    </url_rewrite>

最后查看Mage/Core/Model/Url/Rewrite.php,发现有以下两个函数:

 /**
 * Implement logic of custom rewrites
 . . . 
 * @deprecated since 1.7.0.2. Refactored and moved to Mage_Core_Controller_Request_Rewrite
 */

公共函数重写(...)。 . .

/**
 * Prepare and return QUERY_STRING
. . .
 * @deprecated since 1.7.0.2. Refactored and moved to Mage_Core_Controller_Request_Rewrite
 */
protected function_getQueryString()  . . .

cmets 似乎暗示应该存在一个 Mage_Core_Controller_Request_Rewrite 类,但在 Mage/Core/Controller/Request 中没有这样的类。我能够发现 Magento 团队可能指的是 Mage_Core_Model_Url_Rewrite_Request (我猜他们只是忘记更改评论。我试图在调试器中运行它,但由于我不知道的原因它不断崩溃。我不断收到以下日志:

a:5:i:0;s:77:"Invalid method Mage_Core_Controller_Varien_Front::_getRequestPath(Array
(
)
)";i:1;s:611:"#0 xdebug://debug-eval(1): Varien_Object->__call('_getRequestPath', Array)
1 xdebug://debug-eval(1): Mage_Core_Controller_Varien_Front->_getRequestPath()
2 C:\user\emil\projects\magento\magento\app\code\core\Mage\Core\Controller\Varien\Front.php(1    67): Mage_Core_Controller_Varien_Front::dispatch()
3 C:\user\emil\projects\magento\magento\app\code\core\Mage\Core\Model\App.php(354): Mage_Core_Controller_Varien_Front->dispatch()
4 C:\user\emil\projects\magento\magento\app\Mage.php(683): Mage_Core_Model_App->run(Array)
5 C:\user\emil\projects\magento\magento\index.php(87): Mage::run('', 'store')
6 main";s:3:"url";s:14:"/magento/admin";s:11:"script_name";s:18:"/magento/index.php";s:4:"skin";s:7:"default";

只有当我进入调试模式时才会出现上述问题。总的来说,我试图通过代码来尝试理解新的重写是如何工作的,但最终空手而归并被卡住了。我搜索了谷歌并没有想出太多。我想知道是否有人研究过 Magento EE 的新版本如何用于 URL 重写?

谢谢。

埃米尔

【问题讨论】:

【参考方案1】:

很难回答您的问题,因为新的企业 URL 重写模块已经发生并且仍在发生非常重大的变化。下一个版本 (1.13.0.2) 预计会有一个稳定版本,但在此之前,Magento 核心团队之外的任何人都无法确切地告诉您重写模块的外观和工作方式。

不过,新设置的要点是 Magento 现在从 enterprise_url_rewrite 中提取重写,并且您确定的所有其他表都用于在重新索引过程中重建它。

所有以_cl 结尾的相关表都是与数据库触发器相关联的更改日志。

【讨论】:

注意:Enterprise URL rewrite module 1.13.1 在我看来仍然不稳定:例如看这个magento.stackexchange.com/questions/12804/…

以上是关于新的 Magento1.13 EE URL 重写如何工作/新的数据库表如何相互关联?的主要内容,如果未能解决你的问题,请参考以下文章

Nginx URL重写规则配置详解

Apache新的URL路由重写规则

重写“漂亮的 URL”时如何处理变音符号(口音)

如何用我的案例重写URL

Nginx 配置 URL 重写

url重写后如何知道原始url?