iis服务器助手广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >如何使用 PHP 的 Symfony 事件调度器
  • 435
分享到

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

2024-02-27 19:02:44 435人浏览 泡泡鱼
摘要

今天,我们将学习如何使用 Symfony 事件调度器组件,它允许我们在 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\\": "src"
         },
         "claSSMap": ["src"]
     }
}

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


$ composer dump -o

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

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


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

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

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

Event 类

首先,继续创建具有以下内容的 src/Events/DemoEvent.php 文件。

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 类

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

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 类。 继续并创建 src/Subsribers/DemoSubscriber.php 类,如以下代码片段所示。

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 应用程序中设置事件和侦听器。 通过使用这个库,我们可以创建一个松散耦合的系统,允许我们的应用程序的组件毫不费力地相互通信。

--结束END--

本文标题: 如何使用 PHP 的 Symfony 事件调度器

本文链接: https://www.lsjlt.com/news/568908.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • 如何使用 PHP 的 Symfony 事件调度器
    今天,我们将学习如何使用 Symfony 事件调度器组件,它允许我们在 PHP 应用程序中创建事件和侦听器。 因此,应用程序的不同组件可以通过松散耦合的代码相互通信。 什么是 Symfony 事件...
    99+
    2024-02-27
  • 如何用 Symfony VarDumper 调试 PHP 函数?
    如何用 symfony vardumper 调试 php 函数?安装:通过 composer 安装 vardumper。用法:cli:使用 var_dump() 函数将变量传递给 var...
    99+
    2024-04-23
    symfony composer
  • php如何使用Symfony Route组件进行URL路由?
    随着互联网技术的不断发展,Web应用程序成为了当今互联网世界的重要组成部分。在Web应用程序开发过程中,URL路由是一个非常重要的概念。正确的URL路由设计可以对SEO优化、网站性能以...
    99+
    2024-04-02
  • MySQL事件调度器的用法介绍
    本篇内容主要讲解“MySQL事件调度器的用法介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL事件调度器的用法介绍”吧! 事件调度器有时也可称为临时...
    99+
    2024-04-02
  • php如何使用Symfony Translation组件进行多语言支持?
    Symfony Translation组件是一个强大的工具,可用于简化多语言站点的开发。在本文中,我们将介绍如何使用PHP和Symfony Translation组件来实现一个多语言网...
    99+
    2024-04-02
  • 如何使用PHP-FPM优化提高Symfony应用的性能
    引言:Symfony是一款流行的PHP框架,被许多开发人员广泛采用。然而,高流量和大并发请求情况下,Symfony应用的性能可能会受到影响。PHP-FPM是一个用于管理PHP进程的常见解决方案,可以提供更好的性能和可扩展性。本文将介绍如何使...
    99+
    2023-10-21
    应用性能提升 PHP-FPM优化 Symfony性能优化
  • python包中的sched事件调度器怎么用
    本篇内容主要讲解“python包中的sched事件调度器怎么用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“python包中的sched事件调度器怎么用”吧!一、延迟运行事件在一个延迟或规定时间...
    99+
    2023-06-30
  • Mysql存储过程、触发器、事件调度器怎么使用
    本文小编为大家详细介绍“Mysql存储过程、触发器、事件调度器怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Mysql存储过程、触发器、事件调度器怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。存...
    99+
    2023-06-28
  • 我们如何启动 MySQL 事件调度程序?
    实际上,MySQL事件调度程序是一个在后台运行并不断寻找要执行的事件的进程。但在我们创建或安排一个事件之前,我们只需要启动调度程序。它可以在以下语句的帮助下开始 -mysql> SET GLOBAL event_scheduler =...
    99+
    2023-10-22
  • MySQL中的事件调度器EVENT是怎样的
    这篇文章将为大家详细讲解有关MySQL中的事件调度器EVENT是怎样的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。MySQL中的事件调度器EVENT,可以...
    99+
    2024-04-02
  • Mysql存储过程、触发器、事件调度器使用入门指南
    目录一、存储过程的简单使用二、存储过程中的变量三、变量的作用域四、存储过程参数五、逻辑控制语句1、条件语句2、循环语句3、case分支六、游标七、自定义函数八、触发器九、事件存储过程...
    99+
    2024-04-02
  • 使用 Symfony 组件在 PHP 中进行依赖注入的示例
    在本文中,我们将查看一些使用 Symfony DependencyInjection 组件的示例。 我们将学习依赖注入的基础知识,它允许干净和模块化的代码,我们将看到如何在带有 Symfony 组件的 ...
    99+
    2024-02-27
  • Keras中如何使用学习率调度器
    Keras提供了一个Callback类,可以在模型训练过程中动态地调整学习率。可以通过在fit()方法中传入callbacks参数来...
    99+
    2024-04-02
  • 如何使用 Go 调度器优化 Goroutine 的性能?
    非常抱歉,由于您没有提供文章标题,我无法为您生成一篇高质量的文章。请您提供文章标题,我将尽快为您生成一篇优质的文章。...
    99+
    2024-05-15
  • python如何调用event事件函数
    在python中调用event事件函数的方法有以下几种event.isSet()方法event.isSet()方法是用于返回event的状态值。event.wait()方法event.wait()方法中,如果event.isSet()==F...
    99+
    2024-04-02
  • python 包中的sched 事件调度器的操作方法
    目录一、延迟运行事件二、重叠事件三、事件优先级四、取消事件五、其他方法一、延迟运行事件 在一个延迟或规定时间之后执行事件,需要采用enter()方法,参数如下:间隔时间 ( 具体值决...
    99+
    2024-04-02
  • MYSQL事件高度器的用法
    本篇内容介绍了“MYSQL事件高度器的用法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! 要查看...
    99+
    2024-04-02
  • 如何使用ADO.NET的StateChange事件
    这篇文章主要介绍如何使用ADO.NET的StateChange事件,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!ADO.NET还是比较常用的,于是我研究了一下使用ADO.NET StateChange事件,在这里拿出...
    99+
    2023-06-17
  • MySQL故障切换中事件调度器的注意事项有哪些
    今天就跟大家聊聊有关MySQL故障切换中事件调度器的注意事项有哪些,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。 &nb...
    99+
    2024-04-02
  • 如何使用 PHP 构建基于事件的应用程序
    在 php 中构建基于事件的应用程序的方法包括:使用 eventsource api 创建事件源,并在客户端使用 eventsource 对象监听事件。使用服务器发送的事件 (sse) ...
    99+
    2024-05-04
    php 事件
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作