今天,我们将学习如何使用Symfony事件分派器组件,该组件允许您在PHP应用程序中创建事件和侦听器。 因此,应用程序的不同组件可以使用松散耦合的代码相互通信。
什么是Symfony Event Dispatcher组件?
您可能熟悉事件观察者模式,该模式使您可以定义系统生成的事件的侦听器,以便在触发事件时执行它们。 同样,Symfony EventDispatcher组件使您可以设置一个系统,在其中可以创建自定义事件和侦听器。 这样一来,你让你的应用程序组件,如果事情在一个系统发生反应。
实际上,事件调度程序组件提供了三个元素,您可以围绕它们构建应用程序架构 : 事件,侦听器和调度程序。 整个系统由调度程序类编排,该程序在应用程序中的适当位置引发事件,并调用与这些事件关联的侦听器。
假设您希望允许应用程序中的其他组件在清除缓存后作出反应。 在这种情况下,您首先需要定义清除缓存事件。 清除缓存后,您可以使用分派器引发清除缓存事件,并通知所有正在侦听此事件的侦听器。 这使侦听器有机会清除特定于组件的缓存。
在本文中,我们将探讨事件分配器组件的基础。 我们将从安装和配置开始,并且还将创建一些实际示例来演示上述所有概念。
安装和配置事件分派器
在本节中,我们将安装事件分发程序组件。 我假设您已经在系统上安装了Composer,因为我们需要它来安装EventDispatcher组件。
安装Composer后,继续并使用以下命令安装EventDispatcher组件。
$composer require symfony/event-dispatcher
那应该已经创建了composer.json文件,它应该看起来像这样:
{
"require": {
"symfony/event-dispatcher": "^4.1"
}
}
让我们进一步编辑composer.json文件,使其如下所示:
{
"require": {
"symfony/event-dispatcher": "^4.1"
},
"autoload": {
"psr-4": {
"EventDispatchers\\": "src"
},
"classmap": ["src"]
}
}
当我们添加了新的类映射条目后,继续并通过运行以下命令来更新Composer自动加载器。
$composer dump -o
现在,您可以使用EventDispatchers
命名空间在src目录下自动加载类。
这就是安装部分,但是您应该如何使用它呢? 实际上,只需要在应用程序中包含由Composer创建的autoload.php文件即可,如以下代码片段所示。
<?php
require_once './vendor/autoload.php';
// application code
?>
如何创建,调度和收听事件
在本节中,我们将通过一个示例,演示如何创建自定义事件并为该事件设置侦听器。
活动班
首先,继续创建具有以下内容的src / Events / DemoEvent.php文件。
<?php
namespace EventDispatchers\Events;
use Symfony\Component\EventDispatcher\Event;
class DemoEvent extends Event
{
const NAME = 'demo.event';
protected $foo;
public function __construct()
{
$this->foo = 'bar';
}
public function getFoo()
{
return $this->foo;
}
}
我们的自定义DemoEvent
类扩展了EventDispatcher组件的核心Event
类。 该NAME
不变持有我们的自定义事件的名称- demo.event
。 当您要为此事件设置侦听器时使用。
侦听器类
接下来,让我们使用以下内容创建侦听器类src / Listeners / DemoListener.php 。
<?php
namespace EventDispatchers\Listeners;
use Symfony\Component\EventDispatcher\Event;
class DemoListener
{
public function onDemoEvent(Event $event)
{
// fetch event information here
echo "DemoListener is called!\n";
echo "The value of the foo is: ".$event->getFoo()."\n";
}
}
DemoListener
类实现onDemoEvent
方法,该方法在系统调度DemoEvent
事件时触发。 当然,它不会自动发生,因为我们需要注册DemoListener
侦听器以使用EventDispatcher类侦听demo.event
事件。
到目前为止,我们已经创建了事件和侦听器类。 接下来,我们将看到如何将所有这些部分捆绑在一起。
示例文件
让我们创建具有以下内容的basic_example.php文件。
<?php
// basic_example.php
require_once './vendor/autoload.php';
use Symfony\Component\EventDispatcher\EventDispatcher;
use EventDispatchers\Events\DemoEvent;
use EventDispatchers\Listeners\DemoListener;
// init event dispatcher
$dispatcher = new EventDispatcher();
// register listener for the 'demo.event' event
$listener = new DemoListener();
$dispatcher->addListener('demo.event', array($listener, 'onDemoEvent'));
// dispatch
$dispatcher->dispatch(DemoEvent::NAME, new DemoEvent());
EventDispatcher
类是EventDispatcher组件中最重要的元素,它使您可以将侦听器绑定到他们想侦听的事件。 我们已经使用EventDispatcher
类的addListener
方法来监听demo.event
事件。
addListener
方法的第一个参数是事件名称,第二个参数是PHP可调用,在分派已注册的事件时触发。 在本例中,我们提供了DemoListener
对象作为侦听器以及onDemoEvent
方法。
$dispatcher->addListener('demo.event', array($listener, 'onDemoEvent'));
最后,我们使用了EventDispatcher
类的dispatch
方法来调度demo.event
事件。
$dispatcher->dispatch(DemoEvent::NAME, new DemoEvent());
当您运行basic_example.php文件时,它将产生以下输出。
$php basic_example.php
DemoListener is called!
The value of the foo is: bar
如预期的那样,将onDemoEvent
DemoListener
类的onDemoEvent
方法,然后依次调用DemoEvent
类的getFoo
方法以获取与事件相关的信息。
什么是事件订阅者?
在上一节中,我们构建了一个示例,演示了如何创建自定义事件和自定义侦听器。 我们还讨论了如何使用EventDispatcher
类将侦听器绑定到特定事件。
那是一个简单的示例,因为我们只想为单个事件设置一个侦听器。 另一方面,如果要为多个事件设置侦听器,或者要在单个类中逻辑地将事件处理逻辑分组,则应考虑使用事件订阅者,因为它们可以将所有内容保留在一个地方。
在本节中,我们将修改在上一节中创建的示例。
订户类
我们需要做的第一件事是创建一个实现EventSubscriberInterface
接口的订户类。 继续并创建src / Subsribers / DemoSubscriber.php类,如以下代码片段所示。
<?php
namespace EventDispatchers\Subscribers;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use EventDispatchers\Events\DemoEvent;
class DemoSubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents()
{
return array(
DemoEvent::NAME => 'onDemoEvent',
);
}
public function onDemoEvent(DemoEvent $event)
{
// fetch event information here
echo "DemoListener is called!\n";
echo "The value of the foo is :".$event->getFoo()."\n";
}
}
由于类DemoSubscriber
实现了EventSubscriberInterface
接口,因此它必须实现getSubscribedEvents
方法。 getSubscribedEvents
方法应返回要预订的事件数组。 您需要在数组键中提供事件名称,并在触发事件时调用的数组值中提供方法名称。
最后一件事是在同一类中实现listener方法。 在我们的例子中,我们需要实现onDemoEvent
方法,并且我们已经做到了。
示例文件
现在该测试我们的订户了! 让我们快速创建具有以下内容的subscriber_example.php文件。
<?php
require_once './vendor/autoload.php';
use Symfony\Component\EventDispatcher\EventDispatcher;
use EventDispatchers\Subscribers\DemoSubscriber;
use EventDispatchers\Events\DemoEvent;
// init event dispatcher
$dispatcher = new EventDispatcher();
// register subscriber
$subscriber = new DemoSubscriber();
$dispatcher->addSubscriber($subscriber);
// dispatch
$dispatcher->dispatch(DemoEvent::NAME, new DemoEvent());
您需要使用EventDispatcher
类的addSubscriber
方法来订阅您的自定义订阅者,而EventDispatcher
类将处理其余的订阅者。 它从getSubscribedEvents
方法获取要订阅的事件,并为这些事件设置侦听器。 除此之外,所有内容都是相同的,并且应该可以按预期工作,不会令人惊讶。
让我们测试一下!
$php subscriber_example.php
DemoListener is called!
The value of the foo is: bar
那是一个事件订阅者,随时为您服务! 这也使我们到了本文的结尾。
结论
今天,我们探讨了Symfony事件分配器组件,该组件使您可以在PHP应用程序中设置事件和侦听器。 通过使用此库,您可以创建一个松散耦合的系统,该系统允许应用程序的各个组件轻松地相互通信。
请使用下面的表格随时分享您的想法和疑问!