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)
Змінює код стану відповіді. Для кращої зрозумілості вихідного коду рекомендуємо для коду використовувати замість чисел передбачені константи.
$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 |
'/' |
cookie має область дії на всі шляхи в (під)домені (конфігурується) |
$domain |
null |
що означає з областю дії на поточний (під)домен, але не на його піддомени (конфігурується) |
$secure |
true |
якщо сайт працює на HTTPS, інакше false (конфігурується) |
$httpOnly |
true |
cookie недоступна для JavaScript |
$sameSite |
'Lax' |
cookie може не надсилатися при доступі з іншого домену |
Значення параметрів $path
, $domain
та $secure
за
замовчуванням можна змінити в конфігурації.
Час можна вказувати як кількість секунд або рядок:
$httpResponse->setCookie('lang', 'uk', '100 days'); // Змінено мову на 'uk'
Параметр $domain
визначає, які домени можуть приймати cookie. Якщо
він не вказаний, cookie приймає той самий (під)домен, що й встановив його,
але не його піддомени. Якщо $domain
вказаний, піддомени також
включаються. Тому вказання $domain
є менш обмежувальним, ніж його
відсутність. Наприклад, при $domain = 'nette.org'
cookies доступні також на
всіх піддоменах, таких як 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');