Laravel 中实现服务器发送事件 (SSE) 的两种常见方法

服务器发送事件 (SSE) 可以在 Laravel 应用程序(服务器)和浏览器(客户端)之间实现实时通信。这样,你就可以向用户推送更新,而无需不断刷新页面。以下是在 Laravel 中实现 SSE 的两种常见方法的分步指南。

方法 1:流式响应

这种方法利用了 Laravel 底层的 Symfony 功能。

步骤 1:创建事件类(可选)

如果 SSE 数据具有特定结构,请定义一个 Event 类来表示它。这有助于保持代码的条理性。

class NewOrderEvent
{
    public $orderId;
    public $message;

    public function __construct($orderId, $message)
      {
          $this->orderId = $orderId;
          $this->message = $message;
      }
}

步骤 2:定义 SSE 控制器方法

创建一个控制器方法,负责生成 SSE 事件

public function getEvents(Request $request)
{
    return new StreamedResponse(function () {
        // Logic to generate and yield event data (e.g., using a loop)
        while (true) {
            $event = new NewOrderEvent(123, 'New order placed!');
            yield json_encode($event) . PHP_EOL;
            sleep(2); // Simulate waiting for new data (replace with your logic)
        }
    });
}
  • 该方法使用闭包来定义生成器函数。
  • 在生成器中,将实现生成事件数据的逻辑(例如,从数据库中获取数据)。
  • 使用 yield 发送每个事件的 JSON 编码数据,后面跟一个换行符。
  • Laravel 会创建一个 StreamedResponse 对象,其中包含 SSE 所需的头信息。

步骤 3:客户端实施(JavaScript)

  • 使用 EventSource API 建立与 SSE 端点(本例中为 /events)的连接。
  • 监听连接对象上的 message 事件。
  • 解析接收到的数据(JSON)并相应地更新 UI。

方法 2:使用 SSE 进行广播(使用 qruto/laravel-wave)

这种方法利用了 Laravel 的广播系统和 qruto/laravel-wave 软件包。

步骤 1:安装软件包

使用 Composer 安装 qruto/laravel-wave 软件包:

composer require qruto/laravel-wave

步骤 2:配置(基本设置)

发布软件包配置:php artisan vendor:publish --provider="Qruto\LaravelWave\WaveServiceProvider"
config/broadcasting.php 中配置广播驱动程序(如 Redis)。

步骤 3:创建Event(事件)类

与方法 1 类似,定义一个事件类来表示 SSE 数据。

步骤 4调度事件

在应用程序逻辑中,使用 Laravel 的广播函数调度事件:

Broadcast::channel('orders')->push(new NewOrderEvent(123, 'New order placed!'));

这会将事件发布到orders通道。

步骤 5:客户端实现(JavaScript)

  • 使用 qruto/laravel-wave JavaScript 库订阅订单频道。
  • 监听广播事件,并根据接收到的数据更新用户界面。

选择正确的方法:

  • 流式响应可对事件数据格式进行更多控制,但需要手动连接管理。
  • 使用 SSE 进行广播则提供了一个与 Laravel 事件系统和自动连接处理(通过软件包)更为集成的解决方案。

请记住这是一个基本指南。您需要根据具体情况进行调整,包括错误处理和身份验证(如有必要)。

本文来自作者投稿,版权归原作者所有。如需转载,请注明出处:https://www.nxrte.com/jishu/im/47627.html

(0)

相关推荐

发表回复

登录后才能评论