作为 Magento 2 开发人员,有时您可能需要完全禁用在本机代码或第三方模块中实现的特定事件。一种选择是覆盖观察者方法,但这不是一个好的做法。相反,有更好的方法。您应该使用本机禁用属性。下面是一个关于如何禁用controller_action_noroute事件的示例。最初在 CMS 原生模块中定义:
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
<event name="controller_action_noroute">
<observer name="cms" instance="Magento\Cms\Observer\NoRouteObserver" />
</event>
<event name="controller_action_nocookies">
<observer name="cms" instance="Magento\Cms\Observer\NoCookiesObserver" />
</event>
</config>
为了禁用该事件,我们需要创建一个新的 xml 文件并将禁用属性设置为 true 来定义相同的事件。
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
<event name="controller_action_noroute">
<observer name="cms" disabled="true" />
</event>
</config>
这是有效的,因为Invoker类中的调度方法检查节点,如果值为真,则不会调用观察者方法。看看这个方法就明白了:
public function dispatch(array $configuration, Observer $observer)
{
/** Check whether event observer is disabled */
if (isset($configuration['disabled']) && true === $configuration['disabled']) {
return;
}
...
$this->_