首页 分享 magento2中的事件Events和观察者详细介绍

magento2中的事件Events和观察者详细介绍

来源:花匠小妙招 时间:2025-07-04 18:49
u7cfbu7edfu5b66u4e60magentou4e8cu6b21u5f00u53d1uff0cu63a8u8350u5c0fu518cuff1aMagento中文全栈二次开发 u300aMagentou4e2du6587u5168u6808u4e8cu6b21u5f00u53d1rnu300brn rn rn rn rn rn rn rn rn u672cu5c0fu518cu9762u5411Magento2u4ee5u4e0au7248u672cuff0cu4e66u4ee3u7801u53cau793au4f8bu517cu5bb9magento2.0-2.4u7248u672cu3002u6db5u76d6u4e86magentou524du7aefu5f00u53d1uff0cu540eu7aefu5f00u53d1uff0cmagento2u4e3bu9898,magento2u91cdu5199,magento2 layout,magento2u63a7u5236u5668,magento2 blocku7b49u76f8u5173u5185u5bb9,u5e26u9886u60a8u6210u4e3amagentou5f00u53d1u6280u672fu4e13u5bb6u3002 rn rn Magentou6709u4e00u4e2au6574u6d01u7684u53d1u5e03-u8ba2u9605u6a21u5f0fu5b9eu73b0uff0cu6211u4eecu79f0u4e4bu4e3au4e8bu4ef6u548cu89c2u5bdfu8005u3002u901au8fc7u5728u89e6u53d1u67d0u4e9bu64cdu4f5cu65f6u8c03u5ea6u4e8bu4ef6uff0cu6211u4eecu53efu4ee5u8fd0u884cu81eau5b9au4e49u4ee3u7801u6765u54cdu5e94u89e6u53d1u7684u4e8bu4ef6u3002u8fd9u4e9bu4e8bu4ef6u662fu4f7fu7528MagentoFrameworkeventManageru7c7bu8c03u5ea6u7684uff0cu8be5u7c7bu5b9eu73b0u4e86Magento Frameworkevent ManagerInterfaceu3002u8981u8c03u5ea6u4e8bu4ef6uff0cu6211u4eecu53eau9700u8c03u7528u4e8bu4ef6u7ba1u7406u5668u5b9eu4f8bu7684u8c03u5ea6u65b9u6cd5uff0cu4e3au5176u63d0u4f9bu6211u4eecu6b63u5728u8c03u5ea6u7684u4e8bu4ef6u7684u540du79f0u4ee5u53cau6211u4eecu5e0cu671bu4f20u9012u7ed9u89c2u5bdfu8005u7684u53efu9009u6570u636eu6570u7ec4u5982u4e0bu4f8bu6240u793auff0cu8be5u793au4f8bu53d6u81ea&lt;MAGENTO_DIR&gt;/module-customer/Controller/Account/CreatePost.phpu6587u4ef6uff1a$this&nbsp;-&nbsp;&gt;&nbsp;_eventManager&nbsp;-&nbsp;&gt;&nbsp;dispatch(&#39;customer_register_success&#39;,&nbsp;[&#39;account_controller&#39;&nbsp;=&gt;&nbsp;$this,&nbsp;&#39;customer&#39;&nbsp;=&gt;&nbsp;$customer]);u89c2u5bdfu8005u662fu901au8fc7events.xmlu6587u4ef6u6ce8u518cu7684uff0cu5982&lt;MAGENTO_DIR&gt;/module persistent/etc/frontend/events.xmlu4e2du7684u4ee5u4e0bu793au4f8bu6240u793auff1a&lt;event&nbsp;name=&quot;customer_register_success&quot;&gt;rn&nbsp;&nbsp;&nbsp;&nbsp;&lt;observer&nbsp;name=&quot;persistent&quot;&nbsp;instance=&quot;MagentoPersistentObserverRemovePersistentCookieOnRegisterObserver&quot;&nbsp;/&gt;rn&lt;/event&gt;u901au8fc7u5728u6574u4e2a&lt;MAGENTO_DIR&gt;u76eeu5f55u7684*.phpu6587u4ef6u4e2du67e5u627eeventManager-&gt;dispatchu5b57u7b26u4e32uff0cu6211u4eecu53efu4ee5u770bu5230u6570u767eu4e2au4e8bu4ef6u793au4f8buff0cu5206u5e03u5728MAGENTOu7684u5927u591au6570u6a21u5757u4e2du3002u867du7136u6240u6709u8fd9u4e9bu4e8bu4ef6u90fdu5177u6709u76f8u540cu7684u6280u672fu91cdu8981u6027uff0cu4f46u6211u4eecu53efu4ee5u8bf4uff0cu5176u4e2du4e00u4e9bu4e8bu4ef6u53efu80fdu6bd4u5176u4ed6u4e8bu4ef6u5728u65e5u5e38u57fau7840u4e0au4f7fu7528u5f97u66f4u591au3002u8fd9u4f7fu5f97u82b1u4e00u4e9bu65f6u95f4u7814u7a76u4ee5u4e0bu7c7bu53cau5176u53d1u9001u7684u4e8bu4ef6u53d8u5f97u503cu5f97uff1aMagentoFrameworkAppActionActionu7c7buff0cu5177u6709u4ee5u4e0bu4e8bu4ef6uff1acontroller_action_predispatch&#39;rncontroller_action_predispatch_&#39;&nbsp;.&nbsp;$request-&gt;getRouteName()&#39;rncontroller_action_predispatch_&#39;&nbsp;.&nbsp;$request-&gt;getFullActionName()&#39;rncontroller_action_postdispatch_&#39;&nbsp;.&nbsp;$request-&gt;getFullActionName()&#39;rncontroller_action_postdispatch_&#39;&nbsp;.&nbsp;$request-&gt;getRouteName()rncontroller_action_postdispatchMagentoFrameworkModelAbstractModelu7c7buff0cu5305u542bu4ee5u4e0bu4e8bu4ef6uff1amodel_load_before$this-&gt;_eventPrefix&nbsp;.&nbsp;&#39;_load_before&#39;rnmodel_load_after$this-&gt;_eventPrefix&nbsp;.&nbsp;&#39;_load_after&#39;rnmodel_save_commit_after$this-&gt;_eventPrefix&nbsp;.&nbsp;&#39;_save_commit_after&#39;rnmodel_save_before$this-&gt;_eventPrefix&nbsp;.&nbsp;&#39;_save_before&#39;rnmodel_save_afterclean_cache_by_tags$this-&gt;_eventPrefix&nbsp;.&nbsp;&#39;_save_after&#39;rnmodel_delete_before$this-&gt;_eventPrefix&nbsp;.&nbsp;&#39;_delete_before&#39;rnmodel_delete_afterclean_cache_by_tags$this-&gt;_eventPrefix&nbsp;.&nbsp;&#39;_delete_after&#39;rnmodel_delete_commit_after$this-&gt;_eventPrefix&nbsp;.&nbsp;&#39;_delete_commit_after&#39;$this-&gt;_eventPrefix&nbsp;.&nbsp;&#39;_clear&#39;MagentoFrameworkModelResourceModelDbCollectionu7c7buff0cu5305u542bu4ee5u4e0bu4e8bu4ef6uff1acore_collection_abstract_load_beforern$this-&gt;_eventPrefix&nbsp;.&nbsp;&#39;_load_before&#39;rncore_collection_abstract_load_afterrn$this-&gt;_eventPrefix&nbsp;.&nbsp;&#39;_load_after&#39;u8ba9u6211u4eecu4ed4u7ec6u770bu770bu5176u4e2du4e00u4e2au4e8bu4ef6uff0cu8be5u4e8bu4ef6u4f4du4e8e&lt;MAGENTO_DIR&gt;/framework/Model/AbstractModel.phpu6587u4ef6u4e2duff1apublic&nbsp;function&nbsp;afterCommitCallback()&nbsp;{rn&nbsp;&nbsp;&nbsp;&nbsp;$this&nbsp;-&nbsp;&gt;&nbsp;_eventManager&nbsp;-&nbsp;&gt;&nbsp;dispatch(&#39;model_save_commit_after&#39;,&nbsp;[&#39;object&#39;&nbsp;=&gt;&nbsp;$this]);rn&nbsp;&nbsp;&nbsp;&nbsp;$this&nbsp;-&nbsp;&gt;&nbsp;_eventManager&nbsp;-&nbsp;&gt;&nbsp;dispatch($this&nbsp;-&nbsp;&gt;&nbsp;_eventPrefix.rn&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;_save_commit_after&#39;,&nbsp;$this&nbsp;-&nbsp;&gt;&nbsp;_getEventData());rn&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$this;rn}rnprotected&nbsp;function&nbsp;_getEventData()&nbsp;{rn&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;[&#39;data_object&#39;&nbsp;=&gt;&nbsp;$this,&nbsp;$this&nbsp;-&nbsp;&gt;&nbsp;_eventObject&nbsp;=&gt;&nbsp;$this,&nbsp;];rn}$_eventPrefixu548c$_eventObjectu7c7bu578bu5c5eu6027u5728u8fd9u91ccu7279u522bu91cdu8981u3002u5982u679cu6211u4eecu6d4fu89c8MagentoCatalogModelProductu3001MagentoDatalogModuleCategoryu3001MagentoCustomerModelCustomeru3001Magento Quote Model Quoteu7b49u7c7bu578buff0cMagentoSalesModelOrderu7b49uff0cu6211u4eecu53efu4ee5u770bu5230uff0cu8fd9u4e9bu5b9eu4f53u7c7bu578bu4e2du6709u5f88u591au672cu8d28u4e0au662fu4eceMagentoFrameworkModelAbstractModelu6269u5c55u800cu6765u7684uff0cu5e76u63d0u4f9bu4e86u5b83u4eecu81eau5df1u7684u503cu6765u53d6u4ee3$_eventPrefix=u201ccore_abstractu201du548c$_eventObject=u201cobjectu201du3002u8fd9u610fu5473u7740u6211u4eecu53efu4ee5u4f7fu7528u8bf8u5982$this-&gt;_eventPrefix&#39;u4e4bu7c7bu7684u4e8bu4ef6_save_commit_after&#39;u901au8fc7events.xmlu6307u5b9au89c2u5bdfu8005u3002u8ba9u6211u4eecu770bu4e00u4e0bu4ee5u4e0bu793au4f8buff0cu8be5u793au4f8bu53d6u81ea&lt;MAGENTO_DIR&gt;/module downloadable/etc/events.xmlu6587u4ef6uff1a&lt;config&gt;rn&nbsp;&nbsp;&nbsp;&nbsp;&lt;event&nbsp;name=&quot;sales_order_save_commit_after&quot;&gt;rn&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;observer&nbsp;name=&quot;downloadable_observer&quot;&nbsp;instance=&quot;MagentoDownloadableObserverSetLinkStatusObserver&quot;&nbsp;/&gt;rn&nbsp;&nbsp;&nbsp;&nbsp;&lt;/event&gt;rn&lt;/config&gt;u89c2u5bdfu8005u88abu653eu7f6eu5728&lt;ModuleDir&gt;/Observeru76eeu5f55u4e2du3002u6bcfu4e2au89c2u5bdfu8005u5728MagentoFrameworkEventObserverInterfaceu7c7bu4e0au5b9eu73b0u4e00u4e2au5355u72ecu7684u6267u884cu65b9u6cd5uff1aclass&nbsp;SetLinkStatusObserver&nbsp;implements&nbsp;Magento&nbsp;Framework&nbsp;Event&nbsp;ObserverInterface&nbsp;{rn&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;execute(Magento&nbsp;Framework&nbsp;Event&nbsp;Observer&nbsp;$observer)&nbsp;{rn&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$order&nbsp;=&nbsp;$observer&nbsp;-&nbsp;&gt;&nbsp;getEvent()&nbsp;-&nbsp;&gt;&nbsp;getOrder();rn&nbsp;&nbsp;&nbsp;&nbsp;}rn}u5c31u50cfu63d2u4ef6u4e00u6837uff0cu5b9eu73b0u4e0du597du7684u89c2u5bdfu8005u5f88u5bb9u6613u5bfcu81f4u9519u8befuff0cu751au81f3u7834u574fu6574u4e2au5e94u7528u7a0bu5e8fu3002u8fd9u5c31u662fu4e3au4ec0u4e48u6211u4eecu9700u8981u4fddu6301u89c2u6d4bu5668u7684u5c0fu578bu5316u548cu8ba1u7b97u6548u7387uff0cu4ee5u907fu514du6027u80fdu74f6u9888u3002u5468u671fu6027u4e8bu4ef6u5faau73afu662fu4e00u4e2au5f88u5bb9u6613u9677u5165u7684u9677u9631u3002u5f53u89c2u5bdfu8005u5728u67d0u4e2au65f6u523bu8c03u5ea6u5176u4fa6u542cu7684u540cu4e00u4e8bu4ef6u65f6uff0cu5c31u4f1au53d1u751fu8fd9u79cdu60c5u51b5u3002u4f8bu5982uff0cu5982u679cu89c2u5bdfu8005u4fa6u542cmodel_save_beforeu4e8bu4ef6uff0cu7136u540eu8bd5u56feu5728u89c2u5bdfu8005u4e2du518du6b21u4fddu5b58u540cu4e00u5b9eu4f53uff0cu8fd9u5c06u89e6u53d1u5faau73afu4e8bu4ef6u5faau73afu3002u4e3au4e86u4f7fu6211u4eecu7684u89c2u5bdfu8005u5c3du53efu80fdu5177u4f53uff0cu6211u4eecu9700u8981u5728u9002u5f53u7684u8303u56f4u5185u5ba3u5e03u4ed6u4eecuff1au5bf9u4e8eu53eau89c2u5bdfu524du7aefu7684u4e8bu4ef6uff0cu60a8u53efu4ee5u5728&lt;ModuleDir&gt;/etc/frontend/events.xmlu4e2du58f0u660eu89c2u5bdfu8005u5bf9u4e8eu53eau89c2u5bdfu540eu7aefu7684u4e8bu4ef6u53efu4ee5u5728&lt;ModuleDir&gt;/etc/adminhtml/events.xmlu4e3au4e86u89c2u5bdfu5168u5c40u4e8bu4ef6uff0cu60a8u53efu4ee5u5728&lt;ModuleDir&gt;/etc/events.xmlu4e2du58f0u660eu89c2u5bdfu8005u3002u4e0eu63d2u4ef6u4e0du540cuff0cu89c2u5bdfu8005u7528u4e8eu89e6u53d1u540eu7eedu529fu80fduff0cu800cu4e0du662fu66f4u6539u4f5cu4e3au5176u89c2u5bdfu4e8bu4ef6u4e00u90e8u5206u7684u51fdu6570u6216u6570u636eu7684u884cu4e3au3002""> 系统学习magento二次开发,推荐小册:《Magento中文全栈二次开发 》 本小册面向Magento2以上版本,书代码及示例兼容magento2.0-2.4版本。涵盖了magento前端开发,后端开发,magento2主题,magento2重写,magento2 layout,magento2控制器,magento2 block等相关内容,带领您成为magento开发技术专家。 Magento有一个整洁的发布-订阅模式实现,我们称之为事件和观察者。通过在触发某些操作时调度事件,我们可以运行自定义代码来响应触发的事件。这些事件是使用MagentoFrameworkeventManager类调度的,该类实现了Magento Frameworkevent ManagerInterface。要调度事件,我们只需调用事件管理器实例的调度方法,为其提供我们正在调度的事件的名称以及我们希望传递给观察者的可选数据数组如下例所示,该示例取自<MAGENTO_DIR>/module-customer/Controller/Account/CreatePost.php文件:$this - > _eventManager - > dispatch('customer_register_success', ['account_controller' => $this, 'customer' => $customer]);观察者是通过events.xml文件注册的,如<MAGENTO_DIR>/module persistent/etc/frontend/events.xml中的以下示例所示:<event name="customer_register_success">     <observer name="persistent" instance="MagentoPersistentObserverRemovePersistentCookieOnRegisterObserver" /> </event>通过在整个<MAGENTO_DIR>目录的*.php文件中查找eventManager->dispatch字符串,我们可以看到数百个事件示例,分布在MAGENTO的大多数模块中。虽然所有这些事件都具有相同的技术重要性,但我们可以说,其中一些事件可能比其他事件在日常基础上使用得更多。这使得花一些时间研究以下类及其发送的事件变得值得:MagentoFrameworkAppActionAction类,具有以下事件:controller_action_predispatch' controller_action_predispatch_' . $request->getRouteName()' controller_action_predispatch_' . $request->getFullActionName()' controller_action_postdispatch_' . $request->getFullActionName()' controller_action_postdispatch_' . $request->getRouteName() controller_action_postdispatchMagentoFrameworkModelAbstractModel类,包含以下事件:model_load_before$this->_eventPrefix . '_load_before' model_load_after$this->_eventPrefix . '_load_after' model_save_commit_after$this->_eventPrefix . '_save_commit_after' model_save_before$this->_eventPrefix . '_save_before' model_save_afterclean_cache_by_tags$this->_eventPrefix . '_save_after' model_delete_before$this->_eventPrefix . '_delete_before' model_delete_afterclean_cache_by_tags$this->_eventPrefix . '_delete_after' model_delete_commit_after$this->_eventPrefix . '_delete_commit_after'$this->_eventPrefix . '_clear'MagentoFrameworkModelResourceModelDbCollection类,包含以下事件:core_collection_abstract_load_before $this->_eventPrefix . '_load_before' core_collection_abstract_load_after $this->_eventPrefix . '_load_after'让我们仔细看看其中一个事件,该事件位于<MAGENTO_DIR>/framework/Model/AbstractModel.php文件中:public function afterCommitCallback() {     $this - > _eventManager - > dispatch('model_save_commit_after', ['object' => $this]);     $this - > _eventManager - > dispatch($this - > _eventPrefix.         '_save_commit_after', $this - > _getEventData());     return $this; } protected function _getEventData() {     return ['data_object' => $this, $this - > _eventObject => $this, ]; }$_eventPrefix和$_eventObject类型属性在这里特别重要。如果我们浏览MagentoCatalogModelProduct、MagentoDatalogModuleCategory、MagentoCustomerModelCustomer、Magento Quote Model Quote等类型,MagentoSalesModelOrder等,我们可以看到,这些实体类型中有很多本质上是从MagentoFrameworkModelAbstractModel扩展而来的,并提供了它们自己的值来取代$_eventPrefix=“core_abstract”和$_eventObject=“object”。这意味着我们可以使用诸如$this->_eventPrefix'之类的事件_save_commit_after'通过events.xml指定观察者。让我们看一下以下示例,该示例取自<MAGENTO_DIR>/module downloadable/etc/events.xml文件:<config>     <event name="sales_order_save_commit_after">         <observer name="downloadable_observer" instance="MagentoDownloadableObserverSetLinkStatusObserver" />     </event> </config>观察者被放置在<ModuleDir>/Observer目录中。每个观察者在MagentoFrameworkEventObserverInterface类上实现一个单独的执行方法:class SetLinkStatusObserver implements Magento Framework Event ObserverInterface {     public function execute(Magento Framework Event Observer $observer) {         $order = $observer - > getEvent() - > getOrder();     } }就像插件一样,实现不好的观察者很容易导致错误,甚至破坏整个应用程序。这就是为什么我们需要保持观测器的小型化和计算效率,以避免性能瓶颈。周期性事件循环是一个很容易陷入的陷阱。当观察者在某个时刻调度其侦听的同一事件时,就会发生这种情况。例如,如果观察者侦听model_save_before事件,然后试图在观察者中再次保存同一实体,这将触发循环事件循环。为了使我们的观察者尽可能具体,我们需要在适当的范围内宣布他们:对于只观察前端的事件,您可以在<ModuleDir>/etc/frontend/events.xml中声明观察者对于只观察后端的事件可以在<ModuleDir>/etc/adminhtml/events.xml为了观察全局事件,您可以在<ModuleDir>/etc/events.xml中声明观察者。与插件不同,观察者用于触发后续功能,而不是更改作为其观察事件一部分的函数或数据的行为。

相关知识

Magento2主题 · Magento2实战 · 看云
如何在Magento2中创建主题(第一部分)
magento2网站开发(magento2开发教程)
magento2中的PHP编码规范以及代码示例
序言 · Magento2实战 · 看云
Magento2 入门指南(新手必读)
论magento1和magento2的速度性能优化问题
Magento2实战 · 看云
[转]论magento1和magento2的速度性能优化问题
Apple Events

网址: magento2中的事件Events和观察者详细介绍 https://www.huajiangbk.com/newsview2113906.html

所属分类:花卉
上一篇: magento开发
下一篇: 中国园林博物馆“夏风花园”文化活

推荐分享