事件/观察者模式被_beforeSave()方法重写打破,在几个扩展Mage_Core_Model_Abstract的Magento类中

事件/观察者模式被_beforeSave()方法重写打破,在几个扩展Mage_Core_Model_Abstract的Magento类中,magento,magento-1.7,Magento,Magento 1.7,当试图实现一个观察器来捕获'cataloginventory\u stock\u item\u save\u beforeSave'事件之前,我意识到Mage\u cataloginventory\u Model\u stock\u item中的\u beforeSave(),从而防止系统调度通常的“model\u save\u before”和$this->\u eventPrefix.“u save\u before”事件 在Mage\u Core\u Model\u Abstract中:

当试图实现一个观察器来捕获
'cataloginventory\u stock\u item\u save\u beforeSave'
事件之前,我意识到
Mage\u cataloginventory\u Model\u stock\u item
中的
\u beforeSave(),从而防止系统调度通常的
“model\u save\u before”和
$this->\u eventPrefix.“u save\u before”
事件

Mage\u Core\u Model\u Abstract
中:

protected function _beforeSave()
{
    //...
    Mage::dispatchEvent('model_save_before', array('object'=>$this));
    Mage::dispatchEvent($this->_eventPrefix.'_save_before', $this->_getEventData());
    return $this;
}
protected function _beforeSave()
{
    //...
    parent::_beforeSave();
    //no return in this one!
}
protected function _beforeSave()
{
    //...
    return parent::_beforeSave();
}
图像目录库存模型库存项目中

protected function _beforeSave()
{
    //...some other stuff, but no parent::_beforeSave()!
    return $this;
}
protected function _beforeSave()
{
    parent::_beforeSave();
    //...
    return $this;
}
protected function _afterSave()
{
    parent::_afterSave();
    //...
    return $this;
}
虽然我对Magento很陌生,但这对我来说似乎很奇怪,特别是当看到许多其他Magento类扩展了
Mage\u Core\u Model\u Abstract
,覆盖了
\u beforeSave()
方法,但确实调用了
父::\u beforeSave()
(以各种方式,如以下示例所示)

例如,在
Mage\u Catalog\u Model\u Product
中:

protected function _beforeSave()
{
    //...
    Mage::dispatchEvent('model_save_before', array('object'=>$this));
    Mage::dispatchEvent($this->_eventPrefix.'_save_before', $this->_getEventData());
    return $this;
}
protected function _beforeSave()
{
    //...
    parent::_beforeSave();
    //no return in this one!
}
protected function _beforeSave()
{
    //...
    return parent::_beforeSave();
}
Mage\u目录\u型号\u产品\u比较\u项目中

protected function _beforeSave()
{
    //...some other stuff, but no parent::_beforeSave()!
    return $this;
}
protected function _beforeSave()
{
    parent::_beforeSave();
    //...
    return $this;
}
protected function _afterSave()
{
    parent::_afterSave();
    //...
    return $this;
}
或者在
Mage\u Catalog\u Model\u Abstract

protected function _beforeSave()
{
    //...
    Mage::dispatchEvent('model_save_before', array('object'=>$this));
    Mage::dispatchEvent($this->_eventPrefix.'_save_before', $this->_getEventData());
    return $this;
}
protected function _beforeSave()
{
    //...
    parent::_beforeSave();
    //no return in this one!
}
protected function _beforeSave()
{
    //...
    return parent::_beforeSave();
}
等等

更奇怪的是,
Mage\u CatalogInventory\u Model\u Stock\u Item
也覆盖了
\u afterSave()
,但这次确实调用了父方法:

图像目录库存模型库存项目中

protected function _beforeSave()
{
    //...some other stuff, but no parent::_beforeSave()!
    return $this;
}
protected function _beforeSave()
{
    parent::_beforeSave();
    //...
    return $this;
}
protected function _afterSave()
{
    parent::_afterSave();
    //...
    return $this;
}
我的问题是(专门针对那里的Magento大师):
您是否理解在
Mage\u catalog inventory\u Model\u Stock\u Item
中省略父项::\u beforeSave()
是否有充分的理由?
还是应该列为bug

我想到的唯一修复方法是将整个
Mage\u cataloginventory\u Model\u stock\u item
类从
core
复制到
local
,并添加对
父项的调用::\u beforeSave()
,以捕获
'cataloginventory\u stock\u item\u save'
,或者直接发送到
Mage::dispatchEvent('cataloginventory\u stock\u item\u save\u before',…)

这不是一个糟糕的解决方案吗

(出于好奇)在
Mage\u Core\u Model\u Abstract
的许多其他直接后代中进行了搜索,我发现除了
Mage\u CatalogInventory\u Model\u Stock\u Item
,只有另外两个子类存在相同的问题,至少就
\u beforeSave()
方法而言是如此(我没有检查其他基本事件,如
\u afterSave
等):
Mage\u XmlConnect\u Model\u Application``和
Mage\u Dataflow\u Model\u Batch`。
这让我想到,只有三门课的这种省略可能不是故意的

那么:这是一个bug,还是我错了?

不确定在本文中“蛋白糖”是什么意思,但这是目标
Mage\u Core\u Model\u Abstract
自动触发事件的几个示例之一

  • *_前加载
  • *_加载后
  • *_删除之前的
  • *_删除后面的
  • *_删除后提交
  • *_先救你
  • *_保存后
  • *_保存后提交
…坏了

这是由于子类在被重写(如您所述)时未能调用父模板方法,或者子类中未能重写
\u eventPrefix
。对我来说,这似乎总是一个遗漏,而不是一个意图

在这种情况下,
Mage\u CatalogInventory\u Model\u Stock\u Item::\u beforeSave()
这似乎是一个遗漏。在该类的整个过程中,该方法复制了目标事件逻辑(尽管它在
之前省略了
Model\u save\u的分派)。此文件的将看到添加了
\u eventPrefix
属性,但未能调用父级
\u beforeSave()
方法会导致此目标事件丢失


在本例中,我看到的唯一意图可能是迫使开发人员在产品保存过程的上下文中将cataloginventory对象作为
stock\u item
属性进行操作,但这值得代码注释。

很抱歉我使用了这个关于“或蛋白酥”的苏格兰笑话谢谢你详细的回答!我很高兴看到我没有完全偏离正轨。和你一样,我在git的历史中发现了事件调度的消失。在1.4之前的版本中存在这种调度,这让我想知道是否有一个很好的理由删除它…不管怎样,你同意唯一的解决办法是将整个类从核心复制到本地,并更正它吗?你现在有足够的声誉来voteup,你的问题对我很有用,答案也是,但这是我今天最后一次投票;)即使在版本1.7.0.2中,父项::\u beforeSave();Mage_CatalogInventory_Model_Stock_Item::\u beforeSave()中缺少,并且没有向其中发送任何事件。