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

时间:2012-08-29 13:33:18

标签: 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;
}

Mage_CatalogInventory_Model_Stock_Item

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

虽然我对Magento很新,但这对我来说很奇怪,特别是在查看扩展Mage_Core_Model_Abstract的许多其他Magento类时,覆盖_beforeSave()方法,但 call 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大师):
您是否了解在parent::_beforeSave()中遗漏Mage_CatalogInventory_Model_Stock_Item是否有任何充分理由? 或者它应该被列为错误?

为了能够捕获'cataloginventory_stock_item_save_before'个事件,我想到的唯一解决方法是将整个Mage_CatalogInventory_Model_Stock_Item课程从core复制到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``and Mage_Dataflow_Model_Batch`。
这让我觉得只有三个课程的遗漏可能不是故意的......

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

1 个答案:

答案 0 :(得分:4)

在此上下文中不确定“meringue”的含义,但这是目标 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 version,该方法复制了目标事件逻辑(尽管它省略了model_save_before的分派)。此文件的1.4.0.0-alpha2 version会看到添加的_eventPrefix属性,但无法调用父_beforeSave()方法会导致此目标事件丢失。

我在这个实例中可以看到的唯一目的可能是强制开发人员在产品保存过程的上下文中操作cataloginventory对象作为stock_item属性,但这值得代码注释。 / p>