javascript - 如何避免 Laravel 中服务器发送事件的单一路由

标签 javascript php html laravel server-sent-events

所以我正在尝试使用 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/

相关文章:

javascript - 如何处理 HTML 表单?

php - 测试 X-Sendfile header 是否正常工作

javascript - 将光标放在 IE 中未显示但在 FireFox 中显示的链接上

php - Symfony2 无法在 Debian Linux 上转储 Assets

python - TypeError : request() got an unexpected keyword argument 'header' - when i use header, 403 错误 - 没有 header

html - 响应式固定边栏 CSS

javascript - 使用 XPath 样式访问 Javascript JSON 对象属性

javascript - $rootScope :inprog Action already In Progress

javascript - 在对象数组中的嵌套对象数组中查找字符串

php - mysql行计数器