HTTP-ответ
Nette инкапсулирует HTTP-ответ в объекты с понятным API.
HTTP-ответ представляет собой объект Nette\Http\Response. Если вы работаете с
Nette, этот объект автоматически создается фреймворком, и вы можете
получить его с помощью внедрения зависимостей. В
презентерах достаточно просто вызвать метод $this->getHttpResponse()
.
Nette\Http\Response
Объект, в отличие от Nette\Http\Request, является
mutable (изменяемым), то есть с помощью сеттеров вы можете изменять
состояние, например, отправлять заголовки. Не забывайте, что все
сеттеры должны быть вызваны перед отправкой любого вывода. Был ли
уже отправлен вывод, показывает метод isSent()
. Если он возвращает
true
, любая попытка отправить заголовок вызовет исключение
Nette\InvalidStateException
.
setCode (int $code, ?string $reason=null): static
Изменяет код состояния ответа. Для лучшей понятности исходного кода рекомендуем для кода использовать вместо чисел предопределенные константы.
$httpResponse->setCode(Nette\Http\Response::S404_NotFound);
getCode(): int
Возвращает код состояния ответа.
isSent(): bool
Возвращает, были ли уже отправлены заголовки с сервера в браузер, и, следовательно, уже невозможно отправлять заголовки или изменять код состояния.
setHeader (string $name, string $value): static
Отправляет HTTP-заголовок и перезаписывает ранее отправленный заголовок с тем же именем.
$httpResponse->setHeader('Pragma', 'no-cache');
addHeader (string $name, string $value): static
Отправляет HTTP-заголовок и не перезаписывает ранее отправленный заголовок с тем же именем.
$httpResponse->addHeader('Accept', 'application/json');
$httpResponse->addHeader('Accept', 'application/xml');
deleteHeader (string $name): static
Удаляет ранее отправленный 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): static
Изменяет заголовок 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): static
Устанавливает срок действия (expiration) HTTP-документа с помощью
заголовков Cache-Control
и Expires
. Параметром является либо
временной интервал (как текст), либо null
, что запрещает
кеширование.
// кеш в браузере истечет через час
$httpResponse->setExpiration('1 hour');
sendAsFile (string $fileName): static
Ответ будет скачан с помощью диалогового окна Сохранить как под указанным именем. Сам файл при этом не отправляется.
$httpResponse->sendAsFile('faktura.pdf');
setCookie (string $name, string $value, $time, ?string $path=null, ?string $domain=null, ?bool $secure=null, ?bool $httpOnly=null, ?string $sameSite=null)
Отправляет cookie. Значения по умолчанию параметров:
$path |
'/' |
cookie имеет область действия на все пути в (суб)домене (настраиваемый) |
$domain |
null |
что означает с областью действия на текущий (суб)домен, но не его субдомены (настраиваемый) |
$secure |
true |
если сайт работает по HTTPS, иначе false (настраиваемый) |
$httpOnly |
true |
cookie недоступен для JavaScript |
$sameSite |
'Lax' |
cookie может не отправляться при доступе с другого домена |
Значения по умолчанию параметров $path
, $domain
и $secure
вы можете изменить в конфигурации.
Время можно указывать как количество секунд или строку:
$httpResponse->setCookie('lang', 'cs', '100 days');
Параметр $domain
определяет, какие домены могут принимать cookie.
Если он не указан, cookie принимает тот же (суб)домен, который его
установил, но не его субдомены. Если $domain
указан, субдомены также
включаются. Поэтому указание $domain
менее ограничивающее, чем его
отсутствие. Например, при $domain = 'nette.org'
cookie доступны и на всех
субдоменах, таких как doc.nette.org
.
Для значения $sameSite
вы можете использовать константы
Response::SameSiteLax
, Response::SameSiteStrict
и Response::SameSiteNone
.
deleteCookie (string $name, ?string $path=null, ?string $domain=null, ?bool $secure=null): void
Удаляет cookie. Значения по умолчанию параметров:
$path
с областью действия на все каталоги ('/'
)$domain
с областью действия на текущий (суб)домен, но не его субдомены$secure
определяется настройками в конфигурации
$httpResponse->deleteCookie('lang');