Я просмотрел Этот вопрос SO и Эта статья посвящена реализации событий, отправленных сервером, в Laravel 5. Хотя между ними я не могу понять, как отправлять обновления клиенту на основе события. В этом случае событие представляет собой выбрасываемое ClientException. ClientException в моем приложении вызван ошибкой, сделанной пользователем. Когда один из них выбрасывается, я хочу отправить клиенту обновление, которое заполняет универсальную панель ошибок.
Вот что у меня в лезвии:
<script>
var source = new EventSource("{{ route('globalmessages') }}");
source.addEventListener("message", function(e)
{
$("#errors").html(e);
}, false);
</script>
<div id="errors">
</div>
EventSource успешно выполняет действие контроллера:
public function pushErrors()
{
$response = new StreamedResponse(function()
{
$errors = ???; // How do I populate this
if (!empty($error))
{
echo $error;
ob_flush();
flush();
}
else
{
\Log::info("No errors to push");
}
});
$response->headers->set('Content-Type', 'text/event-stream');
return $response;
}
А обработка ошибок происходит в Handler.php@render:
if ($e instanceof ClientException)
{
$message = $e->getMessage(); // Need to send this to client
return \Response::json([]);
}
else
{
return parent::render($request, $e);
}
Итак, что мне нужно сделать, так это каким-то образом передать ошибки маршруту контроллера. Я пытался использовать синглтон, но не смог заставить его работать. Я пытался дать контроллеру поле для его хранения, но оно всегда было пустым.
Кроме того, эта текущая реализация, кажется, запускается каждые 5 секунд. Я хотел бы иметь возможность вызывать функцию, когда выдается ClientException, чтобы отправить обновление.
Спасибо за любую помощь.
РЕДАКТИРОВАТЬ:
Еще немного информации:
Вот действие контроллера, которое отображает мою страницу:
class HomeController
{
public function getHome()
{
return view('home');
}
}
Мой контроллер, использующий бесконечный цикл:
class MainController extends RouteController
{
public function pushErrors()
{
$response = new StreamedResponse();
$response->headers->set('Content-Type', 'text/event-stream');
$response->headers->set('Cach-Control', 'no-cache');
$response->setCallback(
function()
{
while (true)
{
$error = MessageQueue::dequeue();
if (!empty($error))
{
echo 'data: ' . $error. "\n\n";
ob_flush();
flush();
}
sleep(1);
}
});
return $response;
}
}
Если я убираю цикл while, этот код работает, поскольку сообщение отправляется, соединение разрывается, затем восстанавливается и снова нажимается. С циклом while страница просто зависает.
Мои маршруты:
+--------+----------+----------------+----------------+--------------------------------------------------+------------+
| Domain | Method | URI | Name | Action | Middleware |
+--------+----------+----------------+----------------+--------------------------------------------------+------------+
| | GET|HEAD | globalmessages | globalmessages | App\Http\Controllers\MainController@pushErrors | |
| | GET|HEAD | / | / | App\Http\Controllers\HomeController@getHome | |
| | POST | login | login | App\Http\Controllers\HomeController@postLogin | |
+--------+----------+----------------+----------------+--------------------------------------------------+------------+
HomeController@postLogin — это маршрут, который я вызываю, который генерирует ClientException.
errorsне указан как маршрут в вашем дампе. У вас также есть маршрутglobalmessages, указывающий наMainController@pushErrors, действие в вашем контроллере —pushMessages(), что это? - person Vigs   schedule 10.04.2015