2010-09-16 38 views
3

当创建Magento扩展以避免与加载到商店的其他扩展冲突时,最佳做法是什么?我知道如何使用重写方法,观察者方法以及如何做这种首选方法的细节进行编码。这仍然不会阻止你与其他模块冲突并升级。Magento:避免扩展冲突的最佳方法

Alan Storm,如果你阅读了这篇文章,我也读过你最近关于覆盖和可升级性的文章。这也是考虑这种情况的最佳方式吗?我还看到人们创建的扩展和文章允许多个类扩展相同的类。

回答

11

避免此问题的最佳方法是尽可能使用内置于Magento中的Observer模式。这还不够,但是当你有选择的时候,使用它可以让你在其他表现不好的情况下也能很好地发挥作用。

接下来,尝试覆盖最小数量的类。这听起来很明显,但有些时候我认为有必要重写每一个航运计算器类(代码很简单,但需要重复)。通过一些更多的工作,我可以重写一个类并保存自己的一些维护头痛来启动。

当你这样做的时候,你可能会遇到与其他扩展冲突的问题,覆盖你所在的相同类。不幸的是,这在Magento中并不是一个解决的问题,除了联系有问题的人并解决问题之外,没有一种好的解决方法。

最后,针对可升级性问题,我在人们的代码中看到的一个常见问题是,他们在没有想到的情况下会覆盖整个函数,而不是必要的。所以你得到这个:

function doSomethingUseful() { 
    // ...100 lines of parent code... 
    unset($result['badKey']); 
    // ...100 lines of parent code... 

    return $result; 
} 

当你去升级一个站点时,那200多行代码可能会导致一个bug。艰难时期!取而代之的是,这样的事情经常工作(和是一个简单的改进):

function doSomethingUseful() { 
    $result = parent::doSomethingUseful(); 
    unset($result['badKey']); 
    return $result; 
} 

它的速度更快,这是更具可读性,这是不容易出错,每个人都是赢家!

希望有帮助!

谢谢, 乔

+0

我不能upvote这个答案够了。观察者模式岩石(迄今为止最强大和最灵活的模式)和'parent ::'可悲的是未被充分利用。伟大的建议,应该在Magento wiki的首页。 不幸的是,有时Mage核心不允许使用parent ::,因为有些命令不会将控制权返回给调用对象,但这些都很少见。 – 2010-09-17 00:44:08

+0

非常感谢约瑟夫,我使用观察者模式,但正如你所说的很多次我没有使用的事件,似乎很奇怪,因为有这么多。你强化了我已经遵循的内容,我相信人们会发现这篇文章非常有用。 – 2010-09-17 01:57:20

+1

不要忘记通用的' _save_before',' _save_after',' _load_after','controller_action_predispatch'等。您可以观察和过滤以查找更具体的事件(如果需要)。这些填补了很多似乎缺少事件的空白。 – 2010-09-17 13:32:02