Observers的工作方式
Observers用于捕捉事件之前或之后触发的操作。在观测者中,您可以设置响应时执行的所需功能或逻辑。
Magento 2 Observers可以通过将类文件放在Module Root/Observer目录下创建。Observers类应该实现以下内容:
Magento\Framework\Event\ObserverInterface并定义其执行功能。
如何使用Observers
确保您之前已经注册了新模块进行测试,我们将在此模块上进行练习。
我将使用我的模块SampleEvent。然后,我将使用Observers在产品视图页面上自定义产品名称。
创建Magento 2 Event:
-第一步,我们需要为Magento 2创建一个Event。要创建并添加一个新的Event文件。app/code/Magenest/SampleEvent/etc中的xml并添加一些代码:
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
<event name="catalog_controller_product_view">
<observer name="vendor_resgister_observer" instance="Magenest\SampleEvent\Observer\ProductEvents" />
</event>
</config>
上面的XML代码正在侦听catalog_controller_product_view事件。您需要记住名称和实例属性位于<observer>元素中。name属性定义了每个事件必须唯一的Observer name,而instance属性定义了在调度catalog_controller_product_view事件时需要执行的特定Magento 2类。
创建Magento 2 Observers
-现在要创建Magento 2 Observers,我们可以添加一个新文件ProductEvents。App\Code\Magenest\SampleEvent\Observer中的php,并将此代码添加到其中:
<?php
namespace Magenest\SampleEvent\Observer;
use Magento\Framework\Event\Observer;
use Magento\Framework\Event\ObserverInterface;
class ProductEvents implements ObserverInterface
{
/**
* Below is the method that will fire whenever the event runs!
*
* @param Observer $observer
*/
public function execute(Observer $observer)
{
$product = $observer->getProduct();
$originalName = $product->getName();
$modifiedName = $originalName . ' - Content added by Magenest ';
$product->setName($modifiedName);
}
}
使用观察者Magento 2时的一些做法:
-让你的观察者更有效率:如果可以的话,你应该尽量避免复杂的计算,以保持观察者的小型和高效。因为在观察者中进行复杂的计算会减慢应用程序的进程。
-不要包含业务逻辑:除了运行所需的逻辑之外,观察者不应该包含其他逻辑。业务逻辑应该封装在观察者使用的其他类中。
-在适当范围内宣布观察员:
+对于前端事件,在etc/frontend/events中声明观察者。xml,此事件将仅在前端使用。您不能在后端使用此事件。
+对于后端事件,请在etc/adminhtml/events中声明观察者。xml,此事件将仅在后端使用。此事件不能在前端使用。
+使用全局etc/events。只有在前端和后端都可能发生事件时,才可以使用xml文件。
+您可以放置事件。etc>webapirest>events中的xml。xml,同时处理Rest API请求。
+您可以放置事件。etc>webapisoap>events中的xml。xml,同时处理Soap API请求。
+您可以放置事件。etc>crontab>events中的xml。xml,而仅处理计划作业。
+您可以放置事件。etc>setup>events中的xml。在安装或升级Magento或扩展的过程中。
自定义Observers
步骤1:调度事件
创建一个文件:app/code/Magenest/SampleEvent/Controller/Index/TestEvent。php并添加以下代码:
<?php
namespace Magenest\SampleEvent\Controller\Index;
class TestEvent extends \Magento\Framework\App\Action\Action
{
public function execute()
{
$textDisplay = new \Magento\Framework\DataObject(array('text' => 'Magenest'));
$this->_eventManager->dispatch(magenest_display_text, ['mp_text' => $textDisplay]);
echo $textDisplay->getText();
exit;
}
}
步骤2:events.xml
-在这一步中,我们只捕获事件以在前端显示单词Magenest,因此我们应该创建一个事件。etc/frontend文件夹中的xml文件。
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
<event name="magenest_display_text">
<observer name="display_text" instance="Magenest\SampleEvent\Observer\DisplayText" />
</event>
</config>
步骤3:创建观察者
现在我们将创建一个类来执行上述事件。
文件:app/code/Magenest/SampleEvent/Observer/DisplayText.php
<?php
namespace Magenest\SampleEvent\Observer;
class DisplayText implements \Magento\Framework\Event\ObserverInterface
{
public function execute(\Magento\Framework\Event\Observer $observer)
{
$displayText = $observer->getData('mp_text');
echo $displayText->getText() . " - Some content </br>";
$displayText->setText('Execute event successfully.');
return $this;
}
}