【发布时间】:2017-12-23 17:59:16
【问题描述】:
所以我尝试在我的 laravel 应用程序中使用 Server Sent Events,但问题是在 SSE 中,您只能指定单个 URL,如下所示:
var evtSource = new EventSource("sse.php");
问题是我想从整个应用程序的不同部分/控制器发送事件,而不仅仅是单个 sse.php 文件。示例:
// AuthController.php
public function postLogin(Request $request) {
// login logic
// SEND SSE EVENT ABOUT NEW USER LOGIN
}
// FooController.php
public function sendMessage() {
// SEND SSE EVENT ABOUT NEW MESSAGE
}
我想到的唯一想法是,从这些控制器中创建带有事件文本的临时文件,然后在 sse.php 文件中读取这些文本文件,发送事件,然后删除文件。但是,这看起来并不是完美的解决方案。或者可能以某种方式将 sse.php 文件与 Laravel 事件机制挂钩,但这似乎有点先进。
我也不介意使用不同的 php 文件(如 sse.php)创建多个事件源对象,但问题是这些控制器方法不一定只是单独发送事件,它们还可以做其他工作。例如,我不能直接在 SSE 对象中使用 postLogin 操作,因为它还执行登录逻辑,而不仅仅是发送事件。
有没有人遇到过类似的问题,请问如何解决?
【问题讨论】:
-
我将此作为评论发布,因为它不是(我注意到是否有)完美的解决方案。我会在 laravel 中创建 1 个 API 端点,它接受一些参数(POST 正文或查询字符串)来确定您想要服务的
parts/controllers。如果您愿意,可以在您的“主”控制器中放置一个开关盒。 -
@ThomasMoors:您如何从事件源对象中得知要调用哪个控制器方法,因为它似乎没有额外的参数参数
var evtSource = new EventSource("sse.php");。另外我担心,这在postLogin操作的情况下不起作用,它还执行登录逻辑而不仅仅是发送事件。 -
我的错:它不支持POST only GET所以你只能GET请求查询参数:
var evtSource = new EventSource("sse.php?whatIwant=theSpecialController"); -
@ThomasMoors:谢谢,真的,但我认为对于任何除了发送事件之外还执行某些其他任务的控制器操作,例如
postLogin首先尝试登录用户的方法首先,如果成功,则仅发送事件。 -
我认为您忽略了一个事实,即应该发送 SSE 的代码和响应当前请求的代码存在于两个完全不同的进程中。 SSE 代码需要通过无限循环保持活动状态,并且控制器中的代码仅在单个请求的持续时间内存在。更好的解决方案是使用带有 Redis 后端的 Laravel Echo。
标签: javascript php html laravel server-sent-events