Magento事件event的dispatchEvent分发使用方法:
来源:互联网 发布:淘宝代付被骗怎么办 编辑:程序博客网 时间:2024/06/14 04:41
想必一些初学者在magento中会看到很多Mage::dispatchEvent()这样的方法吧,可能也会和我第一次见时候一样会想这是什么呢?但是如果说magento中的重写方法想必应该会知道吧,但是重写存在一些缺点,当有多个模块的时候,重写同一个类(class)时,那它们互相将会有冲突,只有一个模块将会正常工作,而这时候就是Mage::dispatchEvent()方法发挥作用的时候了。
Mage::dispatchEvent()方法叫作事件的分发,而事件的分发的使用频率应该高于对类的重写(overriding),为什么这么说呢,因为事件的分发可以弥补重写的缺点,使用事件的话,可以多个模块很轻松的去调用它。
Magento中的事件也是根据观察者(Observer)设计模式,它是这样工作的,在Magento核心代码中,许多地方都分发了事件, 每一个事件都有自己唯一的名字和其他相关的参数,在我们自己的模块中,同样也可以调用这些事件,当 Magento 分发这些事件的时候,在我们自己模块中的一个方法将会被触发,在这个方法中我们可以进行相关的操作。Magento调用 Mage::dispatchEvent() 方法来分发事件,你全盘搜索一下的话,会发现Magento代码中很多地方都调用了
现在我来拿我自己做项目中使用到的一个事件来作为例子: Fun_Mobile_Checkout_controllers_V1_CustomerController 接口中的 authenticate 方法来举例
Mage::dispatchEvent( 'mobile_customer_login', array( 'customer' => $customer,'token' => $oldToken, 'device' => $this->getDeviceId(), 'platform' => $this->getPlatform(), 'language' => $this->getUserLanguage() ));
每一个事件都有自己的名字和相关参数在上述方法中,’mobile_customer_login’ 就是自己的名字, array(customer’ =>
<events> <mobile_customer_login><!-- 事件的名字 --> <observers> <generate_token_after_login><!-- 任何唯一的标示符 --> <class>token/observer</class><!-- 我们自己的类(class) --> <method>generateToken</method><!-- 方法名 --> </generate_token_after_login> </observers> </mobile_customer_login></events>
现在可以在任意模块的Model文件夹中建立一个Observer.php文件,随后定义一个方法名为:generateToken()
class Fun_Token_Model_Observer{ public function generateToken(Varien_Event_Observer $observer) { $customer = $observer->getEvent()->getCustomer();<!--这样就能获得到在Mage::dispatchEvent()方法中传的参数--> $customer_id = $customer->getId(); $device_id = $observer->getEvent()->getDevice(); $language = $observer->getEvent()->getLanguage(); $platform = $observer->getEvent()->getPlatform(); /* 7. 这里可以执行相关操作 相关判断,信息获取等10. */ }}
另外,每当一个模块(Model)执行完保存之后,会触发总父类下的save方法,而save方法中存在_beforeSave和_afterSave两个方法,而方法中分别又会触发两个事件
Mage::dispatchEvent('model_save_before', array('object'=>$this));Mage::dispatchEvent($this->_eventPrefix.'_save_before', $this->_getEventData());
Mage::dispatchEvent('model_save_after', array('object'=>$this));Mage::dispatchEvent($this->_eventPrefix.'_save_after', $this->_getEventData());
如果想在保存前或保存后添加相应的信息数据可以重写_beforeSave和_afterSave,样例:
protected function _beforeSave(){ parent::_beforeSave(); if (!$this->getParentId() && $this->getShipment()) { $this->setParentId($this->getShipment()->getId()); } return $this;}
这里使用parent::_beforeSave();的意思是将父类所有的代码功能拿过来直接使用,然后在后面添加自己想加入的相关数据即可。
- Magento事件event的dispatchEvent分发使用方法:
- Event::dispatchEvent
- 自定义事件fireEvent和dispatchEvent的用法
- Event listeners 事件分发机制
- Touch Event事件分发流程
- magento的event机制
- Magento事件机制 - Magento Event/Observer 【magento二次开发】
- Magento 模块开发之DispatchEvent
- [AS3] dispatchEvent与事件流,点击事件的穿透性
- AS3:dispatchEvent与事件流,点击事件的穿透性
- 事件触发器-----dispatchEvent
- 事件触发器---dispatchEvent
- magento的event机制[magento二次开发]
- Magento Event 事件 (1.7.0.0)
- JS自定义事件的定义和触发(createEvent, dispatchEvent)
- JS自定义事件的定义和触发(createEvent, dispatchEvent)
- Magento的路由分发机制
- ViewDragHelper类的使用方法和事件分发机制
- hdoj 1016 Prime Ring Problem
- 正则表达式总结
- 简答
- 详细:java异或运算符
- 习题4(2)
- Magento事件event的dispatchEvent分发使用方法:
- 详解Java三种内存溢出java.lang.OutOfMemoryError: unable to create new native thread,Java heap space,PermGen
- 如何画 软件工程 流程图
- 我的 Android 面试故事(2017下半年)
- XRecyclerview刷新加载
- Eclipse Android项目 为控件添加了Id,但是在Java代码中提示xxx cannot be resolved or is not a field
- 关于 VMware Ubuntu的安装
- 剑指offer面试题七之重建二叉树
- 枚举