Я должен динамически установить мой Content-Type в обратный вызов StreamedResponse.

Я написал такой код, что он прекрасно работает на Symfony 2.3, но не на 2.7. Возвращаемый тип содержимого: text/html.

function indexAction()
{
    $r = new \Symfony\Component\HttpFoundation\StreamedResponse();
    $r->setCallback(function() use ( & $r)
    {
        // ...

        $r->headers->set('Content-Type', 'application/json');

        // ...
    });
    return $r;
}

Я нашел этот коммит, что он может быть включен, но я не совсем понимаю ... © >

Похоже, что теперь мы можем установить только заголовок вне обратного вызова.

Это работает, если я отправляю заголовки с встроенной функцией php в закрытие, но это грязно ...

header('Content-Type: application/json');

Если у кого-то есть подсказка ...

Спасибо!

2
A.Bmt 24 Апр 2017 в 15:19

2 ответа

Лучший ответ

Если быть точным, вы можете использовать хак с заменой заголовков до версии 2.7.19, она была объединена в 2.7.20

Как сказал @MichaelSivolobov в своем ответе, я также никогда не видел случаев, когда это нужно

Я уверен, что такие коммиты всегда сделаны для обеспечения лучшего дизайна приложения. Когда я вижу такие случаи, как в вашем примере, это своего рода красный флаг, чтобы переосмыслить код / поток данных

1
Nikita U. 24 Апр 2017 в 13:06

Потоковый ответ сделан для целей, когда вам нужны соединения с длинным опросом. И поэтому вы должны знать, какой тип контента он будет обслуживать, прежде чем отправлять какие-либо данные.

Когда вы возвращаете объект Response в действии, Symfony уже отправляет заголовки и начинает выводить stream из функции обратного вызова. В данный момент отправлять другой заголовок неправильно.

< EM> P.S . Я никогда не видел случая, когда вам действительно нужно StreamedResponse и нужно динамически устанавливать тип контента.

2
Michael Sivolobov 24 Апр 2017 в 12:45