Новое в Symfony 5.2: HTTP-клиент EventSource

События, отправленные сервером – это Интернет-стандарт, используемый для отправки данных на веб-страницы. Его JavaScript API построен вокруг объекта EventSource, который прослушивает события, отправленные с некоторого URL-адреса. События представляют собой поток данных (обслуживаемый MIME-типом text/event-stream) в следующем формате:

data: This is the first message.

data: This is the second message, it
data: has two lines.

data: This is the third message.

Компонент HttpClient Symfony обеспечивает прочную основу для получения потоковых ответов. Вот почему в Symfony 5.2. представили новую функцию для использования событий, отправленных сервером, с помощью Symfony HttpClient.

Эта функция построена на новом классе EventSourceHttpClient, который обертывает ваш обычный HTTP-клиент и передает отправленные сервером события в виде фрагментов потока:

use Symfony\Component\HttpClient\Chunk\ServerSentEvent;
use Symfony\Component\HttpClient\EventSourceHttpClient;
use Symfony\Component\HttpClient\HttpClient;

$client = HttpClient::create();
$client = new EventSourceHttpClient($client);
// this is the URL that sends server events
$source = $client->connect('https://localhost:8080/events');

while ($source) {
    foreach ($client->stream($source, 2) as $r => $chunk) {
        if ($chunk->isTimeout()) {
            // do something ...
            continue;
        }
        if ($chunk->isLast()) {
            // do something ...
            return;
        }

        // this is a special ServerSentEvent chunk holding the pushed message
        if ($chunk instanceof ServerSentEvent) {
            // do something with the message
        }
    }
}