2

Magento 中的所有块都继承自抽象,并且在代码片段内部:

#File: app/code/core/Mage/Core/Block/Abstract.php   
public function setLayout(Mage_Core_Model_Layout $layout)
{
    $this->_layout = $layout;
    Mage::dispatchEvent('core_block_abstract_prepare_layout_before', array('block' => $this));
    $this->_prepareLayout();
    Mage::dispatchEvent('core_block_abstract_prepare_layout_after', array('block' => $this));
    return $this;
}

有两种方法可以连接到核心块的准备布局:

  1. 将核心块重写为您自己的并创建 _prepareLayout 函数调用它的父级,然后在之后执行您的代码
  2. 观察 core_block_abstract_prepare_layout_after 事件并检查块的实例是否是您感兴趣的实例

第二种的优点是事件/观察者模式是实现附加功能的更好、更稳定的选择。然而,缺点是观察者必须为每个准备好布局的块运行。

这里哪种编程技术更好?

4

1 回答 1

2

如果您重写 Abstract 类,大多数块仍将使用核心中的那个,因为它们直接从它扩展并且不使用 Magento 重写规则。所以我会用你的第二个解决方案来做。即使每个块都有观察者,性能问题也不应该那么大,因为在大多数情况下,您只需使用 instanceof 执行一个简单的条件,这非常快。

于 2013-02-11T14:31:15.533 回答