在这一章节中,我们来了解 Magento 中的事件分发机制 Mage::dispatchEvent()
在创建自己的模块时, Event 事件的分发将会变成十分有用且有效 。
以个人的经验, 事件的分发使用频率应该高于对类的重写(overriding), 为什么这么说呢, 当有多个模块的时候, 重写同一个类(class)时,那它们互相将会有冲突, 只有一个模块将会正常工作, 但是如果你使用事件的话, 那么多个模块都可以很轻松的去调用它
Magento 中的事件也是根据观察者(Observer)设计模式, 它是这样工作的, 在 Magento 核心代码中, 许多地方都分发了事件, 每一个事件都有自己唯一的名字和其他相关的参数, 在我们自己的模块中, 同样也可以调用这些事件, 当 Magento 分发这些事件的时候, 在我们自己模块中的一个方法将会被触发, 在这个方法中我们可以进行相关的操作
Magento 调用 Mage::dispatchEvent() 方法来分发事件, 你全盘搜索一下的话,会发现 Magento 代码中很多地方都调用了
现在我们来拿 Mage_Checkout_Model_Type_Onepage 类中的 saveOrder 方法来举例
class Excellence_Test_Model_Observer
{
public function saveOrderAfter($evt){
$order = $evt->getOrder(); //这样就能获得到在 Mage::dispatchEvent() 方法中传的参数
$quote = $evt->getQuote(); //这样就能获得到在 Mage::dispatchEvent() 方法中传的参数
/*
....
这里可以执行相关操作
发送邮件
等等...
....
*/
}
}
另外,每当一个模块(Model)执行完保存之后,这两个事件会被触发:
Mage::dispatchEvent(
'model_save_before',
array('object' => $this)
);
Mage::dispatchEvent(
'model_save_after',
array('object'=>$this)
);