5

当试图实现一个观察者来捕捉'cataloginventory_stock_item_save_before'事件时,我开始意识到,在不调用其 parent_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;
}

Mage_CatalogInventory_Model_Stock_Item

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

虽然我对 Magento 很陌生,但这对我来说看起来很奇怪,尤其是在查看许多其他扩展Mage_Core_Model_Abstract、覆盖_beforeSave()方法但确实调用的 Magento 类时parent::_beforeSave()(以各种方式,如以下示例所示)。

例如,在Mage_Catalog_Model_Product

protected function _beforeSave()
{
    //...
    parent::_beforeSave();
    //no return in this one!
}

Mage_Catalog_Model_Product_Compare_Item

protected function _beforeSave()
{
    parent::_beforeSave();
    //...
    return $this;
}

或在Mage_Catalog_Model_Abstract

protected function _beforeSave()
{
    //...
    return parent::_beforeSave();
}

等等。

更奇怪的是,Mage_CatalogInventory_Model_Stock_Item也覆盖了_afterSave(),但这次确实调用了父方法:

Mage_CatalogInventory_Model_Stock_Item

protected function _afterSave()
{
    parent::_afterSave();
    //...
    return $this;
}

我的问题是(针对那里的 Magento 大师):您是否了解省略in
是否有任何充分的理由? 还是应该将其列为错误?parent::_beforeSave()Mage_CatalogInventory_Model_Stock_Item

为了能够捕获'cataloginventory_stock_item_save_before'事件,我想到的唯一解决方法是将整个Mage_CatalogInventory_Model_Stock_Item类从coreto复制local,然后添加对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`。
这使我认为,仅在三个班级中的这种遗漏可能不是故意的……

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

4

1 回答 1

4

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

  • *_load_before
  • *_load_after
  • *_delete_before
  • *_delete_after
  • *_delete_commit_after
  • *_save_before
  • *_save_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产品保存过程的上下文中的属性进行操作,但这值得代码注释。

于 2012-08-29T14:14:24.520 回答