magento2中的拦截会取代magento1中的观察者吗?


9

当像magento1中的观察者一样处理Magento2中原始方法的行为时,拦截是否打算成为首选方法?

https://wiki.magento.com/display/MAGE2DOC/Using+Interception

Answers:


16

我不认为拦截旨在取代事件观察者。
Magento2代码中仍然调度有事件。

拦截器只是处理方法输入或输出的一种方法。
或方法的行为(使用around拦截器),但据我了解,这是一种危险的方法。

我认为这是尽可能避免类重写的一种方法。
在Magento 1.x中,如果需要修改方法的结果,则需要覆盖包含的类和方法本身。
现在你可以简单地使用beforeafteraround拦截器来操纵数据。

使用观察者,您可以在方法的某些固定点上操作数据,而不是完整方法本身。

我认为,即使在Magento 2中,尽可能使用观察者仍然是自定义的最佳方法。


2
同意。拦截是较低级别的机制。但是它不能代替事件。活动提供了更高级别的服务提供商界面
Anton Kril 2015年

6

拦截是事件的演变。其目标是允许开发人员编写代码而无需考虑扩展点。

对于事件,您必须考虑执行Mage :: dispatchEvent()的位置,以便可以自定义模块。

拦截使您不必考虑这一点。您只需编写您的业务逻辑。每个方法调用都是一个事件。因此,如果以正确的面向对象的方式编写代码,则可以通过设计完全自定义代码。

但是事件提供了使用商务语言的高级服务提供接口。因此,活动将保留在Magento 2中。


您能否在devdocs中得到这个重要的事实,将其作为混乱的根源,尤其是因为您在M2中仍然有很多事件时,尤其如此。如果我们知道事件已经死了,我们可以相应地进行编码,那么我在文档中都没有提到这一点。在其他语言中,有时会使用事件,而有时会使用拦截器,我认为您需要澄清一下Magento 2是不同的。
卡伦·贝克

5

当前,仍然可以选择侦听特定事件,我建议拦截器只是重写的替代品。当您有需要的地方时,我仍然会使用这些事件。

如果您查看当前版本,则某些模块的events.xml文件包含定义。

<event name="cms_wysiwyg_images_static_urls_allowed">
    <observer name="catalog_wysiwyg" instance="Magento\Catalog\Model\Observer"  />
</event>

在Magento-2中,最新版本的观察者模式已更改。现在您无需在events.xml中声明方法属性,它将自动运行execute方法,类似于控制器。
Keyur Shah 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.