Метод stream
Метод stream класса AbstractController возвращает объект StreamedResponse и применяется для отдачи больших объёмов данных: файлов, логов, выгрузок из базы. Первым параметром передаётся callback, который получает поток вывода $output и записывает в него данные. Вторым параметром можно передать HTTP-статус, третьим - массив заголовков. Данные отправляются клиенту по мере записи в поток, поэтому память не переполняется.
Синтаксис
stream(callable $callback, int $status = 200, array $headers = []): StreamedResponse
Пример
Давайте отдадим клиенту строку 'abcde' через потоковый ответ:
<?php
namespace AppController;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationStreamedResponse;
class ArticleController extends AbstractController
{
public function index(): StreamedResponse
{
return $this->stream(function ($output) {
echo 'abcde';
});
}
}
?>
Результат выполнения кода:
abcde
Пример
Давайте отдадим данные порциями, записывая их в поток в цикле:
<?php
namespace AppController;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationStreamedResponse;
class ArticleController extends AbstractController
{
public function index(): StreamedResponse
{
return $this->stream(function ($output) {
foreach ([1, 2, 3, 4, 5] as $num) {
echo $num . ' ';
}
});
}
}
?>
Результат выполнения кода:
1 2 3 4 5
Пример
Давайте отдадим CSV-файл с заголовками для скачивания:
<?php
namespace AppController;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationStreamedResponse;
class ArticleController extends AbstractController
{
public function download(): StreamedResponse
{
return $this->stream(
function ($output) {
echo "name,value\n";
echo "article,1\n";
echo "user,2\n";
},
200,
[
'Content-Type' => 'text/csv',
'Content-Disposition' => 'attachment; filename="data.csv"',
]
);
}
}
?>
В ответ клиент получит CSV-файл с именем data.csv и содержимым из двух строк данных.
Смотрите также
-
класс
AbstractController,
базовый класс контроллера Symfony -
метод
render,
который рендерит Twig-шаблон -
метод
json,
который возвращает JSON-ответ -
метод
file,
который отдаёт файл из файловой системы