HTTP-ответ
Nette инкапсулирует HTTP-ответ в объекты с понятным API, обеспечивая при этом фильтр санации.
HTTP-ответ – это объект Nette\Http\Response, который вы получаете,
передавая его с помощью инъекции
зависимостей. В презентаторах просто вызывайте
$httpResponse = $this->getHttpResponse()
.
Nette\Http\Response
В отличие от Nette\Http\Request, этот объект является
изменяемым, поэтому вы можете использовать сеттеры для изменения
состояния, т.е. для отправки заголовков. Помните, что все сеттеры
должны быть вызваны до отправки фактического вывода. Метод
isSent()
показывает, был ли отправлен вывод. Если он возвращает
true
, то каждая попытка отправить заголовок вызывает исключение
Nette\InvalidStateException
.
setCode(int $code, ?string $reason=null)
Изменяет код ответа статуса. Для лучшей читаемости исходного кода рекомендуется использовать предопределенные константы вместо реальных чисел.
$httpResponse->setCode(Nette\Http\Response::S404_NotFound);
getCode(): int
Возвращает код статуса ответа.
isSent(): bool
Возвращает, были ли заголовки уже отправлены с сервера в браузер, поэтому уже невозможно отправить заголовки или изменить код статуса.
setHeader(string $name, string $value)
Отправляет HTTP-заголовок и перезаписывает ранее отправленный одноименный заголовок.
$httpResponse->setHeader('Pragma', 'no-cache');
addHeader(string $name, string $value)
Отправляет HTTP-заголовок и не перезаписывает ранее отправленный одноименный заголовок.
$httpResponse->addHeader('Accept', 'application/json');
$httpResponse->addHeader('Accept', 'application/xml');
deleteHeader(string $name)
Удаляет ранее отправленный HTTP-заголовок.
getHeader(string $header): ?string
Возвращает отправленный HTTP-заголовок, или null
, если он не
существует. Параметр не чувствителен к регистру.
$pragma = $httpResponse->getHeader('Pragma');
getHeaders(): array
Возвращает все отправленные HTTP-заголовки в виде ассоциативного массива.
$headers = $httpResponse->getHeaders();
echo $headers['Pragma'];
setContentType(string $type, ?string $charset=null)
Отправляет заголовок Content-Type
.
$httpResponse->setContentType('text/plain', 'UTF-8');
redirect(string $url, int $code=self::S302_Found): void
Перенаправляет на другой URL. Не забудьте после этого выйти из скрипта.
$httpResponse->redirect('http://example.com');
exit;
setExpiration(?string $time)
Устанавливает срок действия HTTP-документа, использующего заголовки
Cache-Control
и Expires
. Параметром является либо временной
интервал (в виде текста), либо null
, который отключает
кэширование.
// срок действия кэша браузера истекает через час
$httpResponse->setExpiration('1 hour');
sendAsFile(string $fileName)
Ответ должен быть загружен с помощью диалога Сохранить как с указанным именем. Сам файл на вывод не отправляется.
$httpResponse->sendAsFile('invoice.pdf');
setCookie(string $name, string $value, $time, ?string $path=null, ?string $domain=null, ?bool $secure=null, ?bool $httpOnly=null, ?string $sameSite=null)
Отправляет cookie. Значения параметров по умолчанию:
$path |
'/' |
с охватом всех путей на (под)домене (настраивается). |
$domain |
null |
с областью действия текущего (под)домена, но не его поддоменов (настраивается). |
$secure |
true |
если сайт работает на HTTPS, иначе false (настраивается). |
$httpOnly |
true |
cookie недоступна для JavaScript |
$sameSite |
'Lax' |
cookie не нужно отправлять при доступе из другого источника |
Вы можете изменить значения по умолчанию параметров $path
,
$domain
и $secure
в конфигурация.
Время может быть указано в виде количества секунд или строки:
$httpResponse->setCookie('lang', 'en', '100 days');
Параметр $domain
определяет, какие домены (origin) могут принимать
cookie. Если параметр не указан, cookie принимается тем же (под)доменом,
который задан, исключая их поддомены. Если указан $domain
, то
поддомены также включаются. Поэтому указание $domain
является
менее ограничительным, чем опущение. Например, если $domain = 'nette.org'
,
cookie также доступен на всех поддоменах, как doc.nette.org
.
Для значения $sameSite
можно использовать константы
Response::SameSiteLax
, SameSiteStrict
и SameSiteNone
.
deleteCookie(string $name, ?string $path=null, ?string $domain=null, ?bool $secure=null): void
Удаляет файл cookie. По умолчанию параметры имеют следующие значения:
$path
с областью действия на все каталоги ('/'
)$domain
с областью действия на текущий (под)домен, но не на его поддомены.$secure
зависит от настроек в конфигурации
$httpResponse->deleteCookie('lang');