服务器发送事件 (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