Magento 重复类重写

Posted

技术标签:

【中文标题】Magento 重复类重写【英文标题】:Magento duplicate class rewrite 【发布时间】:2011-07-18 04:21:02 【问题描述】:

我正在使用两个不同的 Magento 模块,比如 First_ModuleSecond_Module,它们覆盖了同一个类。我想结合它们的功能。 我的假设是我可以从First_Module 中的同一类扩展重复的类Second_Module,这反过来又扩展了原始类。 我猜要做到这一点,First_Module 应该依赖于Second_Module,所以我在模块的配置中添加了<depends>Second_Module</depends>

我现在希望配置加载器首先加载Second_Module,并且它不再有效的重复类标记将被First_Module 配置中的相同语句覆盖。但情况似乎并非如此。第一个rewrite好像用了。

我做错了什么/理解错了还是这就是它的工作原理?也许我应该从配置中的第二个模块中删除重写(我宁愿不这样做以使其尽可能保持原始状态)。

提前致谢。

【问题讨论】:

【参考方案1】:

Magento 类自动加载器不是为一个类的多个覆盖而设计的,因为这个概念实际上没有任何意义。没有办法强制第二个覆盖尊重第一个覆盖,因此他们根本没有实现它。

此外,您通常不能依赖安装两个单独的模块(在核心模块之外),因此您容纳其他覆盖的能力充其量是脆弱的。

如果你想做到这一点,首先看看 Magento 的事件委托系统。许多侦听器可以对一个事件进行操作,因此这对您来说可能是一种自然的情况。

此外,正如其他人最近在一个问题中指出的那样,您可以创建同一类的两个子类,并使用其中的每一个而不是原来的。这将不允许您修改现有的系统行为,但如果您只需要扩展核心类,它可能就足够了。在这种情况下,您将直接调用这些类(如Mage::getClass("mymodule/extended_customer");

希望能对情况有所了解。

谢谢, 约瑟夫·马斯蒂

【讨论】:

+1 用于更多该死的事件观察者使用。我希望人们不要再覆盖核心类,我希望 Magento 团队会添加更多的挂钩点,这样我们就不必这样做了。 @Nick,也许我们需要一个活动来为数百个事件集成点提交社区补丁。 您是否签署了 MCA 以提交代码?如果一整批带有新事件分派的提交命中 repo,那么看看他们的响应会很有趣 @Jonathan 还没有,但我可能会这样做【参考方案2】:

作为一个旁白回答约瑟夫,可以为你省去很多麻烦,你可以简单地制作第二个重写类(magento重写系统没有看到的那个),成为重写后看到的类的祖先(首先读取 Joseph 指出的配置),因此如果两个类都不会影响相同的方法,那么您将最终拥有两个功能和一个重写..

我经常为“通用客户密码”扩展程序这样做,我的客户发现它非常有用,但碰巧重写了客户模型,并且根据经验,它是一个客户类,它经常被许多商业扩展程序重写还是不..

【讨论】:

以上是关于Magento 重复类重写的主要内容,如果未能解决你的问题,请参考以下文章

Magento - URL 重写或重定向问题

Magento 重写核心模型资源集合

网址重写导致 Magento 管理员无法访问

如何在 Magento 中获取订单时间?

magento重写资源类型的models

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