如何为PHP使用Symfony Event Dispatcher

今天,我们将学习如何使用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应用程序中设置事件和侦听器。 通过使用此库,您可以创建一个松散耦合的系统,该系统允许应用程序的各个组件轻松地相互通信。

请使用下面的表格随时分享您的想法和疑问!

翻译自: https://code.tutsplus.com/tutorials/handling-events-in-your-php-applications-using-the-symfony-eventdispatcher-component--cms-31328

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值