Nette Documentation Preview

syntax
HTTP отговор
************

.[perex]
Nette капсулира HTTP отговора в обекти с разбираем API.

HTTP отговорът представлява обект [api:Nette\Http\Response]. Ако работите с Nette, този обект се създава автоматично от framework-а и можете да го получите чрез [dependency injection |dependency-injection:passing-dependencies]. В презентерите е достатъчно само да извикате метода `$this->getHttpResponse()`.

→ [Инсталация и изисквания |@home#Инсталация]


Nette\Http\Response
===================

Обектът, за разлика от [Nette\Http\Request|request], е mutable, т.е. с помощта на сетъри можете да променяте състоянието, например да изпращате хедъри. Не забравяйте, че всички сетъри трябва да бъдат извикани **преди изпращането на какъвто и да е изход.** Дали вече е бил изпратен изход показва методът `isSent()`. Ако връща `true`, всеки опит за изпращане на хедър ще предизвика изключение `Nette\InvalidStateException`.


setCode(int $code, ?string $reason=null) .[method]
--------------------------------------------------
Променя [кода на състоянието на отговора |https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10]. За по-добра разбираемост на изходния код препоръчваме за кода да се използват вместо числа [предварително дефинирани константи |api:Nette\Http\IResponse].

```php
$httpResponse->setCode(Nette\Http\Response::S404_NotFound);
```


getCode(): int .[method]
------------------------
Връща кода на състоянието на отговора.


isSent(): bool .[method]
------------------------
Връща дали вече са били изпратени хедъри от сървъра към браузъра и следователно вече не е възможно да се изпращат хедъри или да се променя кодът на състоянието.


setHeader(string $name, string $value) .[method]
------------------------------------------------
Изпраща HTTP хедър и **презаписва** предишно изпратен хедър със същото име.

```php
$httpResponse->setHeader('Pragma', 'no-cache');
```


addHeader(string $name, string $value) .[method]
------------------------------------------------
Изпраща HTTP хедър и **не презаписва** предишно изпратен хедър със същото име.

```php
$httpResponse->addHeader('Accept', 'application/json');
$httpResponse->addHeader('Accept', 'application/xml');
```


deleteHeader(string $name) .[method]
------------------------------------
Изтрива предишно изпратен HTTP хедър.


getHeader(string $header): ?string .[method]
--------------------------------------------
Връща изпратен HTTP хедър или `null`, ако такъв не съществува. Параметърът е case-insensitive.

```php
$pragma = $httpResponse->getHeader('Pragma');
```


getHeaders(): array .[method]
-----------------------------
Връща всички изпратени HTTP хедъри като асоциативен масив.

```php
$headers = $httpResponse->getHeaders();
echo $headers['Pragma'];
```


setContentType(string $type, ?string $charset=null) .[method]
-------------------------------------------------------------
Променя хедъра `Content-Type`.

```php
$httpResponse->setContentType('text/plain', 'UTF-8');
```


redirect(string $url, int $code=self::S302_Found): void .[method]
-----------------------------------------------------------------
Пренасочва към друг URL. Не забравяйте след това да прекратите скрипта.

```php
$httpResponse->redirect('http://example.com');
exit;
```


setExpiration(?string $time) .[method]
--------------------------------------
Задава изтичането на HTTP документа с помощта на хедърите `Cache-Control` и `Expires`. Параметърът е или времеви интервал (като текст), или `null`, което забранява кеширането.

```php
// кешът в браузъра изтича след час
$httpResponse->setExpiration('1 hour');
```


sendAsFile(string $fileName) .[method]
--------------------------------------
Отговорът ще бъде изтеглен с помощта на диалоговия прозорец *Запиши като* под посоченото име. Самият файл при това не се изпраща.

```php
$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) .[method]
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
Изпраща бисквитка. Стойностите по подразбиране на параметрите:

| `$path`     | `'/'`   | бисквитката има обхват за всички пътища в (под)домейна *(конфигурируемо)*
| `$domain`   | `null`  | което означава с обхват за текущия (под)домейн, но не и неговите поддомейни *(конфигурируемо)*
| `$secure`   | `true`  | ако сайтът работи на HTTPS, иначе `false` *(конфигурируемо)*
| `$httpOnly` | `true`  | бисквитката е недостъпна за JavaScript
| `$sameSite` | `'Lax'` | бисквитката може да не бъде изпратена при [достъп от друг домейн |nette:glossary#SameSite cookie]

Стойностите по подразбиране на параметрите `$path`, `$domain` и `$secure` можете да промените в [конфигурацията |configuration#HTTP бисквитки].

Времето може да се посочва като брой секунди или низ:

```php
$httpResponse->setCookie('lang', 'bg', '100 days');
```

Параметърът `$domain` определя кои домейни могат да приемат бисквитката. Ако не е посочен, бисквитката се приема от същия (под)домейн, който я е задал, но не и от неговите поддомейни. Ако `$domain` е зададен, са включени и поддомейните. Затова посочването на `$domain` е по-малко ограничаващо от пропускането му. Например при `$domain = 'nette.org'` бисквитките са достъпни и на всички поддомейни като `doc.nette.org`.

За стойността `$sameSite` можете да използвате константите `Response::SameSiteLax`, `SameSiteStrict` и `SameSiteNone`.


deleteCookie(string $name, ?string $path=null, ?string $domain=null, ?bool $secure=null): void .[method]
--------------------------------------------------------------------------------------------------------
Изтрива бисквитка. Стойностите по подразбиране на параметрите са:
- `$path` с обхват за всички директории (`'/'`)
- `$domain` с обхват за текущия (под)домейн, но не и неговите поддомейни
- `$secure` се управлява според настройките в [конфигурацията |configuration#HTTP бисквитки]

```php
$httpResponse->deleteCookie('lang');
```

HTTP отговор

Nette капсулира HTTP отговора в обекти с разбираем API.

HTTP отговорът представлява обект Nette\Http\Response. Ако работите с Nette, този обект се създава автоматично от framework-а и можете да го получите чрез dependency injection. В презентерите е достатъчно само да извикате метода $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, ако такъв не съществува. Параметърът е case-insensitive.

$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('faktura.pdf');

setCookie(string $name, string $value, $time, ?string $path=null, ?string $domain=null, ?bool $secure=null, ?bool $httpOnly=null, ?string $sameSite=null)

Изпраща бисквитка. Стойностите по подразбиране на параметрите:

$path '/' бисквитката има обхват за всички пътища в (под)домейна (конфигурируемо)
$domain null което означава с обхват за текущия (под)домейн, но не и неговите поддомейни (конфигурируемо)
$secure true ако сайтът работи на HTTPS, иначе false (конфигурируемо)
$httpOnly true бисквитката е недостъпна за JavaScript
$sameSite 'Lax' бисквитката може да не бъде изпратена при достъп от друг домейн

Стойностите по подразбиране на параметрите $path, $domain и $secure можете да промените в конфигурацията.

Времето може да се посочва като брой секунди или низ:

$httpResponse->setCookie('lang', 'bg', '100 days');

Параметърът $domain определя кои домейни могат да приемат бисквитката. Ако не е посочен, бисквитката се приема от същия (под)домейн, който я е задал, но не и от неговите поддомейни. Ако $domain е зададен, са включени и поддомейните. Затова посочването на $domain е по-малко ограничаващо от пропускането му. Например при $domain = 'nette.org' бисквитките са достъпни и на всички поддомейни като doc.nette.org.

За стойността $sameSite можете да използвате константите Response::SameSiteLax, SameSiteStrict и SameSiteNone.

deleteCookie(string $name, ?string $path=null, ?string $domain=null, ?bool $secure=null)void

Изтрива бисквитка. Стойностите по подразбиране на параметрите са:

  • $path с обхват за всички директории ('/')
  • $domain с обхват за текущия (под)домейн, но не и неговите поддомейни
  • $secure се управлява според настройките в конфигурацията
$httpResponse->deleteCookie('lang');