由_beforeSave()方法覆盖的事件/观察者模式覆盖在几个扩展Mage_Core_Model_Abstract的Magento类中

tpi*_*apw 5 magento magento-1.7

当试图实现观察者以捕获'cataloginventory_stock_item_save_before'事件时,我已经意识到该_beforeSave()方法Mage_CatalogInventory_Model_Stock_Item会覆盖Mage_Core_Model_Abstract 不调用其父级的方法,从而阻止系统调度通常'model_save_before'$this->_eventPrefix.'_save_before'事件......

Mage_Core_Model_Abstract:

protected function _beforeSave()
{
    //...
    Mage::dispatchEvent('model_save_before', array('object'=>$this));
    Mage::dispatchEvent($this->_eventPrefix.'_save_before', $this->_getEventData());
    return $this;
}
Run Code Online (Sandbox Code Playgroud)

Mage_CatalogInventory_Model_Stock_Item:

protected function _beforeSave()
{
    //...some other stuff, but no parent::_beforeSave()!
    return $this;
}
Run Code Online (Sandbox Code Playgroud)

虽然我很新的Magento的,这看起来怪我,在这延长许多其他Magento的类别看尤其是Mage_Core_Model_Abstract,覆盖_beforeSave()的方法,但呼叫parent::_beforeSave()(以各种方式,如可以在下面的例子中可以看出).

例如,在Mage_Catalog_Model_Product:

protected function _beforeSave()
{
    //...
    parent::_beforeSave();
    //no return in this one!
}
Run Code Online (Sandbox Code Playgroud)

Mage_Catalog_Model_Product_Compare_Item:

protected function _beforeSave()
{
    parent::_beforeSave();
    //...
    return $this;
}
Run Code Online (Sandbox Code Playgroud)

或者在Mage_Catalog_Model_Abstract:

protected function _beforeSave()
{
    //...
    return parent::_beforeSave();
}
Run Code Online (Sandbox Code Playgroud)

等等.

甚至怪异,Mage_CatalogInventory_Model_Stock_Item也覆盖了_afterSave(),但这次确实调用父类的方法:

Mage_CatalogInventory_Model_Stock_Item:

protected function _afterSave()
{
    parent::_afterSave();
    //...
    return $this;
}
Run Code Online (Sandbox Code Playgroud)

我的问题是(用于Magento的大师那里):
你了解是否有此疏漏任何正当理由parent::_beforeSave()Mage_CatalogInventory_Model_Stock_Item
或者它应该被列为错误?

为了能够捕获'cataloginventory_stock_item_save_before'事件,我想到的唯一修复是将整个Mage_CatalogInventory_Model_Stock_Item类复制corelocal,并向parent::_beforeSave()或直接添加调用Mage::dispatchEvent('cataloginventory_stock_item_save_before', ...).
这个解决方案不是一个坏的黑客?

在其他许多直接后代中搜索过(仅凭好奇心)Mage_Core_Model_Abstract,我发现除此之外Mage_CatalogInventory_Model_Stock_Item,只有两个其他子类共享相同的问题,至少就_beforeSave()方法而言(我没有检查过其他基本事件)如_afterSave等):Mage_XmlConnect_Model_Application``andMage_Dataflow_Model_Batch`.
这让我觉得只有三个课程的遗漏可能不是故意的......

所以:这是一个错误,还是我错了?

ben*_*rks 4

不确定在这种情况下“蛋白酥皮”是什么意思,但这是目标 Mage_Core_Model_Abstract自动触发事件的几个例子之一......

  • *_加载_之前
  • *_加载_之后
  • *_删除_之前
  • *_删除_之后
  • *_delete_commit_after
  • *_保存_之前
  • *_保存_之后
  • *_save_commit_after

……坏了。

发生这种情况是由于子类在重写时无法调用父模板方法(正如您所提到的),或者是由于无法重写子_eventPrefix类中的方法。对我来说,这似乎一直是一种疏忽,而不是一种意图。

在这种情况下,Mage_CatalogInventory_Model_Stock_Item::_beforeSave()这似乎是一个遗漏。在此类的1.3.2.4 版本中,该方法会重复目标事件逻辑(尽管它省略了 的分派model_save_before)。该文件的1.4.0.0-alpha2 版本看到_eventPrefix已添加该属性,但调用父_beforeSave()方法失败会导致该目标事件丢失。

在这种情况下,我能看到的唯一目的可能是强制开发人员将 CatalogInventory 对象作为stock_item产品保存过程上下文中的属性进行操作,但这需要代码注释。