我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何使用 PHP 的 Symfony 事件调度器

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何使用 PHP 的 Symfony 事件调度器

今天,我们将学习如何使用 Symfony 事件调度器组件,它允许我们在 PHP 应用程序中创建事件和侦听器。 因此,应用程序的不同组件可以通过松散耦合的代码相互通信。


什么是 Symfony 事件调度器组件?

我们可能熟悉事件观察者模式,它允许我们为系统生成的事件定义侦听器,以便在事件触发时执行它们。 同样,Symfony EventDispatcher 组件允许我们设置一个系统,我们可以在其中创建自定义事件和侦听器。 通过这种方式,我们可以让应用程序中的组件在系统中发生某些事情时做出反应。

事实上,事件调度器组件提供了三个元素,我们可以围绕这些元素构建应用程序架构:事件、侦听器和派发器。 整个系统由调度程序类编排,它在应用程序中的适当点引发事件并调用与这些事件关联的侦听器。

假设我们希望应用程序中的其他组件在清除缓存时做出反应。 在这种情况下,我们需要首先定义清除缓存事件。 清除缓存后,我们可以使用调度程序引发清除缓存事件,并通知所有正在侦听此事件的侦听器。 这使侦听器有机会清除特定于组件的缓存。

在本文中,我们将探讨事件分发器组件的基础知识。 我们将从安装和配置开始,我们还将创建一些真实示例来演示上述所有概念。

安装和配置事件调度程序

在本节中,我们将安装事件分发器组件。 我假设大家已经在系统上安装了 Composer,因为我们需要它来安装 EventDispatcher 组件。

安装 Composer 后,继续使用以下命令安装 EventDispatcher 组件。


$ composer require symfony/event-dispatcher

那应该已经创建了 composer.json 文件,它应该如下所示:

composer.json


{
    "require": {
        "symfony/event-dispatcher": "^5.4"
    }
}

让我们进一步编辑 composer.json 文件,如下所示:

composer.json


{
    "require": {
        "symfony/event-dispatcher": "^5.4"
    },
    "autoload": {
         "psr-4": {
             "EventDispatchers\\": "class="lazy" data-src"
         },
         "classmap": ["class="lazy" data-src"]
     }
}

当我们添加了一个新的类映射条目时,继续并通过运行以下命令更新 Composer 自动加载器。


$ composer dump -o

现在,我们可以使用 EventDispatchers 命名空间自动加载 class="lazy" data-src 目录下的类。

这就是安装部分,但是我们应该如何使用它呢? 事实上,这只是将 Composer 创建的 autoload.php 文件包含在您的应用程序中的问题,如以下代码段所示。


require_once './vendor/autoload.php';
 
// 应用程序代码

如何创建、分发和监听事件

在本节中,我们将通过一个示例演示如何创建自定义事件并为该事件设置侦听器。

Event 类

首先,继续创建具有以下内容的 class="lazy" data-src/Events/DemoEvent.php 文件。

class="lazy" data-src/Events/DemoEvent.php


namespace EventDispatchers\Events;
 
use Symfony\Contracts\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。 当我们想为此事件设置侦听器时使用它。

Listener 类

接下来,让我们创建具有以下内容的监听器类 class="lazy" data-src/Listeners/DemoListener.php

class="lazy" data-src/Listeners/DemoListener.php


namespace EventDispatchers\Listeners;
 
use Symfony\Contracts\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 事件时触发。 当然,它不会自动发生,因为我们需要使用 EventDispatcher 类注册 DemoListener 侦听器来侦听 demo.event 事件。

到目前为止,我们已经创建了事件和侦听器类。 接下来,我们将看看如何将所有这些部分联系在一起。

示例文件

让我们创建具有以下内容的 basic_example.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(new DemoEvent(), DemoEvent::NAME);

EventDispatcher 类是 EventDispatcher 组件中最重要的元素——它允许您将侦听器绑定到他们想要侦听的事件。 我们使用了 EventDispatcher 类的 addListener 方法来监听 demo.event 事件。

addListener 方法的第一个参数是在派发注册事件时触发的 PHP 可调用对象,第二个参数是事件名称。 在我们的例子中,我们提供了 DemoListener 对象作为侦听器以及 onDemoEvent 方法。


$dispatcher->addListener('demo.event', array($listener, 'onDemoEvent'));

最后,我们使用了 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

正如预期的那样,调用了 DemoListener 类的 onDemoEvent 方法,然后又调用了 DemoEvent 类的 getFoo 方法来获取与事件相关的信息。


什么是事件订阅者?

在上一节中,我们构建了一个示例,演示了如何创建自定义事件和自定义侦听器。 我们还讨论了如何使用 EventDispatcher 类将侦听器绑定到特定事件。

这是一个简单的例子,因为我们只想为单个事件设置一个监听器。 另一方面,如果我们想要为多个事件设置侦听器,或者我们想要在逻辑上将事件处理逻辑分组到一个类中,我们应该考虑使用事件订阅者,因为它们允许我们将所有内容保存在一个地方。

在本节中,我们将修改在上一节中创建的示例。

Subscriber

我们需要做的第一件事是创建一个实现 EventSubscriberInterface 接口的 Subscriber 类。 继续并创建 class="lazy" data-src/Subsribers/DemoSubscriber.php 类,如以下代码片段所示。

class="lazy" data-src/Subsribers/DemoSubscriber.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 了! 让我们快速创建包含以下内容的 subscriber_example.php 文件。

subscriber_example.php


require_once './vendor/autoload.php';
use Symfony\Component\EventDispatcher\EventDispatcher;
use EventDispatchers\Subscribers\DemoSubscriber as DemoSubscriber;
use EventDispatchers\Events\DemoEvent;
 
// init event dispatcher 
$dispatcher = new EventDispatcher();
 
// register subscriber 
$subscriber = new DemoSubscriber();
$dispatcher->addSubscriber($subscriber);
 
// dispatch 
$dispatcher->dispatch(new DemoEvent(), DemoEvent::NAME);

我们需要使用 EventDispatcher 类的 addSubscriber 方法来订阅我们的自定义订阅者,EventDispatcher 类会处理剩下的事情。 它从 getSubscribedEvents 方法获取要订阅的事件,并为这些事件设置侦听器。 除此之外,一切都是一样的,它应该按预期工作,没有任何意外。

让我们测试一下!


$ php subscriber_example.php
DemoListener is called!
The value of the foo is: bar

那就是我们可以使用的事件订阅者! 这也将我们带到了本文的结尾。


如何停止事件传播

有时,多个侦听器正在侦听同一个事件。 在这种情况下,我们可能希望停止向下一个后续侦听器传播事件。 在本节中,我们将了解如何在侦听器的帮助下实现它。

让我们重新访问我们之前创建的侦听器类。


namespace EventDispatchers\Listeners;
 
use Symfony\Contracts\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";
      $event->stopPropagation();
    }
}

如大家所见,我们使用了 stopPropagation 方法来停止事件传播。 这意味着正在侦听 demo.event 事件但尚未被调用的侦听器将不会被调用。 所以这是为此事件调用的最后一个侦听器。 我们还可以使用 isPropagationStopped 方法来检测事件传播是否被任何侦听器停止。


如何使用 PHP 闭包作为监听器

到目前为止,我们已经讨论了如何将 PHP 对象添加为侦听器。 事实上,我们也可以使用 PHP 闭包来代替 PHP 对象。

让我们快速修改前面的示例。


require_once './vendor/autoload.php';
use Symfony\Component\EventDispatcher\EventDispatcher;
use EventDispatchers\Events\DemoEvent;
 
// init event dispatcher 
$dispatcher = new EventDispatcher();
 
// register closure listener for the 'demo.event' event 
$dispatcher->addListener('demo.event', function (DemoEvent $event) {
    echo "DemoListener is called!\n";
    echo "The value of the foo is: ".$event->getFoo()."\n";
});
 
// dispatch 
$dispatcher->dispatch(new DemoEvent(), 'demo.event');

如您所见,我们在 addListener 方法的第二个参数中使用了 PHP 闭包。

总结

今天,我们探索了 Symfony 事件调度器组件,它允许我们在 PHP 应用程序中设置事件和侦听器。 通过使用这个库,我们可以创建一个松散耦合的系统,允许我们的应用程序的组件毫不费力地相互通信。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何使用 PHP 的 Symfony 事件调度器

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何使用 PHP 的 Symfony 事件调度器

今天,我们将学习如何使用 Symfony 事件调度器组件,它允许我们在 PHP 应用程序中创建事件和侦听器。 因此,应用程序的不同组件可以通过松散耦合的代码相互通信。什么是 Symfony 事件调度器组件?我们可能熟悉事件观察者模式,它允许
如何使用 PHP 的 Symfony 事件调度器
2024-02-27

如何使用PHP-FPM优化提高Symfony应用的性能

引言:Symfony是一款流行的PHP框架,被许多开发人员广泛采用。然而,高流量和大并发请求情况下,Symfony应用的性能可能会受到影响。PHP-FPM是一个用于管理PHP进程的常见解决方案,可以提供更好的性能和可扩展性。本文将介绍如何使
2023-10-21

python包中的sched事件调度器怎么用

本篇内容主要讲解“python包中的sched事件调度器怎么用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“python包中的sched事件调度器怎么用”吧!一、延迟运行事件在一个延迟或规定时间
2023-06-30

Mysql存储过程、触发器、事件调度器怎么使用

本文小编为大家详细介绍“Mysql存储过程、触发器、事件调度器怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Mysql存储过程、触发器、事件调度器怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。存
2023-06-28

如何使用 Go 调度器优化 Goroutine 的性能?

go 中的调度器通过以下方式优化 goroutine 性能:负载均衡:在多个 cpu 核心中均匀分布 goroutine 以提高资源利用率。轻量级线程调度:创建和销毁 goroutine 的成本低,调度器可以快速调度大量 goroutine
如何使用 Go 调度器优化 Goroutine 的性能?
2024-05-15

如何使用ADO.NET的StateChange事件

这篇文章主要介绍如何使用ADO.NET的StateChange事件,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!ADO.NET还是比较常用的,于是我研究了一下使用ADO.NET StateChange事件,在这里拿出
2023-06-17

如何使用 PHP 构建基于事件的应用程序

在 php 中构建基于事件的应用程序的方法包括:使用 eventsource api 创建事件源,并在客户端使用 eventsource 对象监听事件。使用服务器发送的事件 (sse) 发送事件,并在客户端使用 xmlhttprequest
如何使用 PHP 构建基于事件的应用程序
2024-05-04

php如何调用文件类的方法

要调用一个文件类的方法,首先需要先创建一个该类的实例对象,然后通过该对象调用相应的方法。以下是一个示例代码:```php// 创建文件类的实例对象$file = new File();// 调用文件类的方法$file->open('exam
2023-10-09

如何使用Eclipse进行PHP的服务器端调试

这篇文章将为大家详细讲解有关如何使用Eclipse进行PHP的服务器端调试,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。首先,得将您PHP本地运行时的php.ini里的xdebug.remote_enab
2023-06-04

如何使用ChatGPT PHP构建智能客户满意度调查工具

如何使用ChatGPT PHP构建智能客户满意度调查工具引言:在当前数字化时代,客户满意度对企业的发展至关重要。客户满意度调查是评估客户对产品或服务的满意程度的一种常见方法。随着人工智能技术的发展,我们可以利用ChatGPT PHP来构建一
2023-10-26

如何用 Blackfire 调试 PHP 函数的内存使用?

使用 blackfire 分析 php 函数内存使用情况的方法:安装 blackfire:使用指定的命令安装。配置 blackfire:创建 blackfire.yaml 配置文件,设置服务器 url、客户端 id、客户端令牌和日志保存选项
如何用 Blackfire 调试 PHP 函数的内存使用?
2024-04-23

如何正确的使用Java事件通知

如何正确的使用Java事件通知,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。通过实现观察者模式来提供 Java 事件通知(Java event notification)似乎不
2023-06-17

如何使用 PHP 内置的函数调试工具?

php 内置调试工具包括 print_r()、var_dump() 和 debug_backtrace() 等,它们分别以人可读方式打印变量值、提供更详细的变量信息,以及创建包含调用堆栈信息的数组。实战案例中,你可以使用 var_dump(
如何使用 PHP 内置的函数调试工具?
2024-04-18

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录