今天,我们将学习如何使用 symfony 事件调度器组件,它允许您在 php 应用程序中创建事件和***器。因此,应用程序的不同组件可以通过松散耦合的代码相互通信。
什么是 Symfony 事件调度程序组件?
您可能熟悉事件观察者模式,它允许您为系统生成的事件定义***器,以便在事件触发时执行它们。类似地,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类扩展Event了 EventDispatcher 组件的核心类。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监听器以demo.event使用 EventDispatcher 类监听事件。
到目前为止,我们已经创建了事件和***器类。接下来,我们将看到如何将所有这些部分联系在一起。
示例文件
让我们使用以下内容创建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 组件中最重要的元素——它允许您将***器绑定到他们想要***的事件。我们已经使用类的addListener方法EventDispatcher来监听demo.event事件。
该addListener方法的第一个参数是事件名称,第二个参数是 PHP 可调用的,当注册的事件被调度时触发。在我们的例子中,我们将DemoListener对象作为***器与onDemoEvent方法一起提供。
$dispatcher->addListener('demo.event', array($listener, 'onDemoEvent'));
最后,我们使用类的dispatch方法EventDispatcher来调度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,然后调用类的getFoo方法DemoEvent来获取与事件相关的信息。
什么是事件订阅者?
在上一节中,我们构建了一个示例,演示了如何创建自定义事件和自定义***器。我们还讨论了如何使用类将***器绑定到特定事件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方法应返回您要订阅的事件数组。您需要在数组键中提供事件名称,并在触发事件时调用的数组值中提供方法名称。
最后一件事是在同一个类中实现监听器方法。在我们的例子中,我们需要实现这个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());
您需要使用该类的addSubscriber方法EventDispatcher来订阅您的自定义订阅者,其余EventDispatcher的由该类处理。它从方法中获取要订阅的事件,并为这些事件设置监听器。除此之外,一切都是一样的,它应该按预期工作,没有任何意外。getSubscribedEvents
让我们测试一下!
$php subscriber_example.php DemoListener is called! The value of the foo is: bar
那是您可以使用的事件订阅者!这也将我们带到了本文的结尾。
结论
今天,我们探索了 Symfony 事件调度器组件,它允许您在 PHP 应用程序中设置事件和***器。通过使用这个库,您可以创建一个松散耦合的系统,使您的应用程序的组件可以毫不费力地相互通信。
- 事件类
- 监听类
- 示例文件
- 订阅者类
- 示例文件