在这篇博客中,我们将看到如何在magento2中运行事件。

magento中的事件是扩展核心功能的重要特性,让我们看看事件在magento2中的作用。

 

事件基础

magento中的事件遵循观察者模式,这意味着,在magento核心模块中的许多地方发出事件,我们可以在自定义模块中编写代码来监听这些事件并执行操作。

事件依然是在核心模块之上添加功能的最佳方式,原因是它们不与其他模块冲突,可以将多个事件监听器附加到单个事件。

怎样设置事件

要添加事件,我们首先需要确定它是前端事件或后端事件,根据这一点,我们需要创建一个配置文件

前端事件

Magease/Hello/etc/frontend/events.xml

后端事件

Magease/Hello/etc/adminhtml/events.xml

现在我们只看前端事件

因此,在我们的模块中,我们添加了文件etc/frontend/events.xml,其中包含以下内容

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
<event name="controller_action_predispatch">
<observer name="magease_hello_test_observer" instance="Magease\Hello\Observer\Predispatch" />
</event>
</config>

事件名称应该是唯一的

接下来让我们定义监听器

Magease\Hello\Observer\Predispatch.php

并编写代码

<?php
namespace Magease\Hello\Observer;

use \Psr\Log\LoggerInterface;
use Magento\Framework\Event\Observer;
use Magento\Framework\Event\ObserverInterface;

class Predispatch implements ObserverInterface
{

protected $logger;

public function __construct(LoggerInterface $logger)
{
$this->logger = $logger;
}

public function execute(Observer $observer)
{
$this->logger->warn('Observer Works');
//exit; un commet this to make sure event works
}
}

由于我们使用了事件'controller_action_predispatch',因此该监听器可以监听每个页面。如果您打开任何前端页面,您应该在var/log/system.log文件夹中看到“Observer Works”。

让我们来看看另一个使用更复杂事件的例子。

要查找通过magento派发的事件,您需要打开核心文件并查找事件,让我们在登录时编写一个代码来记录客户名称。
查看模型'Magento\Customer\Model\Customer'我们发现相关事件

$this->_eventManager->dispatch(
'customer_customer_authenticated',
['model' => $this, 'password' => $password]
);

让我们在events.xml文件中为此事件添加监听器

<event name="customer_customer_authenticated">
<observer name="magease_hello_customer_customer_authenticated" instance="Magease\Hello\Observer\Customer\Authenticated" />
</event>

接下来让我们创建一个类

Magease\Hello\Observer\Customer\Authenticated.php

编写代码

<?php
namespace Magease\Hello\Observer\Customer;

use \Psr\Log\LoggerInterface;
use Magento\Framework\Event\Observer;
use Magento\Framework\Event\ObserverInterface;

class Authenticated implements ObserverInterface
{

protected $logger;

public function __construct(LoggerInterface $logger)
{
$this->logger = $logger;
}

public function execute(Observer $observer)
{
$customer = $observer->getModel();
//print_r($customer->getData());exit;
$this->logger->warn('Customer Logged IN:' . $customer->getFirstname());
}
}

 在上面的例子中,我们可以看到如何从$observer中检索事件数据并使用它