Как я могу установить несколько ключей заголовка с Slim Framework 3 - PullRequest
0 голосов
/ 25 февраля 2020

Я использую приведенный ниже пример кода для возврата данных в браузер

$response->write($image);
return $response->withHeader('Content-Type', 'image/jpeg');

, который работает нормально, но как бы я go об этом, если бы я хотел также вернуть Content-Length? Единственный вариант, который я нашел, - это скопировать ответ в новый объект, как показано ниже, но я не думаю, что это эффективно, если в ответе есть $ image.

$response = $response->withAddedHeader('Content-Length', strlen($image));

Я пробовал его как массив но это не работает ..

1 Ответ

1 голос
/ 26 февраля 2020

Цитирование из Тонкий 3 документа

Напоминание
В отличие от метода withHeader (), этот метод добавляет новое значение к набору значения, которые уже существуют для того же имени заголовка. Объект Response является неизменным. Этот метод возвращает копию объекта Response с добавленным значением заголовка.

Оба метода withHeader() и appendedHeader() возвращают копию объекта ответа. Поэтому, даже если вы не присваиваете возвращаемое значение $response->withHeader() переменной и не возвращаете результат напрямую, вы все равно работаете с копией объекта ответа.

Что касается вашей озабоченности по поводу эффективности, вам следует использовать потоков вместо строки в качестве тела ответа. Ниже приведен пример использования потоков для возврата изображения в качестве ответа:

<?php

use Slim\App;
use Slim\Http\Request;
use Slim\Http\Response;
use Slim\Http\Body;

return function (App $app) {
    $container = $app->getContainer();
    $app->get('/', function(Request $request, Response $response) {
        $image = fopen('sample.jpg', 'r');
        return $response->withBody(new Body($image))
            ->withHeader('Content-Type', 'image/jpeg')
            ->withAddedHeader('Content-Length', fstat($image)['size']);
    });
};
...