所以我正在尝试使用 Server Sent Events在我的 laravel 应用程序中,但问题是在 SSE 中,您只能指定单个 URL,如:
var evtSource = new EventSource("sse.php");
问题是我想从整个应用程序的不同部分/ Controller 发送事件,而不仅仅是单个 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
}
我想到的唯一想法是,从这些 Controller 创建带有事件文本的临时文件,然后在 sse.php
文件中读取这些文本文件,发送事件,然后删除文件。然而,这看起来并不是完美的解决方案。或者可能以某种方式将 sse.php
文件与 Laravel 事件机制 Hook ,但这似乎有点高级。
我也不介意使用不同的 php 文件创建多个事件源对象,例如 sse.php
但问题是这些 Controller 方法不一定只是单独发送事件,它们还做其他工作出色地。例如,我不能直接在 SSE 对象中使用 postLogin
操作,因为它还执行登录逻辑,而不仅仅是发送事件。
有没有人遇到过类似的问题,如何解决?
最佳答案
从未使用过 SSE,但根据他们的文档,我想到了两种解决方案:
1.定义多个EventSource
对象并在您的js 中以不同方式处理它们:
var loginSource = new EventSource("{!! url("/loginsse") !!}");
var messageSource = new EventSource("{!! url("/messagesse") !!}");
2。在您的 sse.php
文件中,检查来自其他 Controller 的更新:
//sse.php called function
while(1) {
$login = AuthController::postLogin($request);
if ($login) return $login;
$msg = FooController::sendMessage();
if ($msg) return $msg;
// ...
}
您需要创建 sendMessage()
和 postLogin(Request $request)
静态方法。
还要考虑采用一些库来将 SSE 与 laravel 结合使用:快速谷歌搜索为我提供了几种可能性。
关于javascript - 如何避免 Laravel 中服务器发送事件的单一路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45174029/