Magento 2 选择合适的事件

在Magento中扩展标准逻辑的最强大和最常用的技术之一是事件系统。我们在前一篇文章中详细描述了这个系统。对于开发人员来说,了解事件系统是如何工作的非常有用。此外,为自定义逻辑实现选择最合适的事件也是开发中非常重要的一部分——因此,在本文中,我们将回顾框架级别的事件列表,以帮助理解在Magento 2中观察哪个事件最合适。

Magento2 控制器中的事件

我们可以在分派控制器之前执行代码(在调用控制器类的execute()方法之前)。以下是允许这样做的事件列表:

  1. controller_action_predispatch—在每个控制器调度之前执行。
  2. controller_action_predispatch_{route_name} – 在具有特定 {route_name} 的控制器之前执行。例如,要在 CMS 页面控制器调度之前执行观察者,我们应该为 controller_action_predispatch_cms 事件注册观察者。控制器路由名称可以在您感兴趣的区域的扩展的 routes.xml 文件中找到。
  3. controller_action_predispatch_{full_action_name} – 在每个具有特定 {full_action_name} 的控制器之前执行。完整的动作名称由路由名称、控制器名称和动作名称后跟下划线字符组成。例如,主页的完整操作名称是 cms_index_index。要在主页控制器调度之前执行观察者,我们应该将观察者注册到 controller_action_predispatch_cms_index_index 事件。

此外,我们可以在调度控制器后执行我们的代码。为此,请检查以下事件集:

  1. controller_action_postdispatch_{full_action_name} – 在具有特定 {full_action_name} 的控制器之后执行。
  2. controller_action_postdispatch_{route_name} – 在每个具有特定 {route_name} 的控制器之后执行。
  3. controller_action_postdispatch – 在每个控制器调度后执行。

渲染系统中的事件

在 Magento 2 中有许多事件可以在页面渲染流的不同部分执行观察者:

  1. layout_load_before – 在加载当前页面的布局之前执行。从这一点上,我们可以访问以下对象:
    1. $observer->getFullActionName() – 当前动作的全名。
    2. $observer->getFullActionName() – 当前动作的全名。
  2. layout_generate_blocks_before – 在加载布局之后和生成布局块之前执行。在这里,我们还可以访问前一个事件中提到的相同对象。
  3. layout_generate_blocks_after – 在生成当前页面布局中的块后执行。
  4. core_layout_render_element – 在渲染块后执行。以下是此事件中可用对象的列表:
    1. $observer->getElementName() – 获取事件块的名称。
    2. $observer->getLayout() – 获取当前页面的布局。
    3. $observer->getTransport() – 获取包含渲染元素的 Magento\Framework\DataObject 类的实例。
  5. view_block_abstract_to_html_before – 在块被发送到输出之前执行。以下是此事件的可用对象列表:
    1. $observer->getBlock() – 获取一个事件块。
  6. layout_render_before_{full_action_name} – 在呈现具有特定 {full_action_name} 的页面布局之前执行。
  7. layout_render_before – 在呈现每个页面布局之前执行。

模型中的事件

通常,模型扩展 Magento\Framework\Model\AbstractModel 类。它提供了观察一组预定义的模型事件的能力。并且模型应该有 AbstractModel::_eventPrefix 属性指定用于观察特定模型的事件。默认情况下,该属性的值等于“core_abstract”。

此外,在模型中,我们有 AbstractModel::_eventObject 属性,可以为不同的特定于模型的事件指定当前模型实例的名称。

查看全局模型事件列表

  1. model_load_before – 在加载每个模型之前执行。在这里我们可以访问以下事件的数据:
    1. $observer->getField() – 获取当前处理的模型的字段名称。
    2. $observer->getValue() – 获取当前处理模型的字段值。
  2. model_load_after – 在每次模型加载后执行。
  3. model_save_before – 在每次保存模型之前执行。
  4. model_save_after – 在每次模型保存后执行。
  5. clean_cache_by_tags – 在清除模型相关的缓存标签后执行。
  6. model_delete_before – 在删除模型之前执行。
  7. model_delete_after – 在删除模型后执行。
  8. model_save_commit_after – 在提交模型保存事务后执行。
  9. model_delete_commit_after – 在模型保存事务提交被删除后执行。

在上述事件中,我们可以访问以下数据:

$observer - > getObject () // 获取当前模型实例

现在,让我们检查特定于模型的事件:

  1. {event_prefix}_load_before – 在加载带有 {event_prefix} 的模型之前执行。
  2. {event_prefix}_load_after – 在加载带有 {event_prefix} 的模型后执行。
  3. {event_prefix}_save_before – 在保存带有 {event_prefix} 的模型之前执行。
  4. {event_prefix}_save_after – 在保存带有 {event_prefix} 的模型后执行。
  5. {event_prefix}_save_after – 在保存带有 {event_prefix} 的模型后执行。
  6. {event_prefix}_save_after – 在保存带有 {event_prefix} 的模型后执行。
  7. {event_prefix}_save_after – 在保存带有 {event_prefix} 的模型后执行。
  8. event_prefix}_delete_commit_after – 在删除带有 {event_prefix} 的模型数据提交后执行。
  9. {event_prefix}_clear – 在模型对象准备好由垃圾收集器正确删除时执行。

此外,我们可以从它们中的每一个中访问以下事件数据:

  1. $observer->getDataObject() – 获取当前模型引用。
  2. $observer->get {event_object} – 获取当前模型的事件对象。

集合中的事件

在 Magento 中,我们能够在集合加载流程上执行自定义代码。为此,我们可以使用以下事件列表:

  1. core_collection_abstract_load_before – 在每次集合加载之前执行。
  2. core_collection_abstract_load_after – 在每次集合加载后执行。

从这些事件的观察者,我们可以使用这种方式访问​​当前集合:

$observer->getCollection()

与模型类似,我们可以指定 AbstractCollection 类的 $_eventPrefix 和 $_eventObject 字段。这些属性的创建目的与 AbstractModel 相同——通过以下事件帮助观察者实现特定集合:

  1. {event_prefix}_load_before – 在使用 {event_prefix} 收集之前执行。
  2. event_prefix}_load_after – 在加载带有 {event_prefix} 的集合后执行。

然后从特定于集合的事件中,我们可以访问依赖于 AbstractCollection::_eventObject 属性的当前集合:

$observer->get{event_object}()

例如,如果 AbstractCollection::_eventObject 等于“my_collection”,我们可以使用以下代码访问当前集合:

$observer->getMyCollection()

本文参考:https://www.atwix.com/magento-2/choose-your-perfect-event/