Nette Documentation Preview

syntax
HTTP response
*************

.[perex]
Nette zapouzdřuje HTTP odpověď do objektů se srozumitelným API.

HTTP odpověď představuje objekt [api:Nette\Http\Response], ke kterému se dostanete tak, že si jej necháte předat pomocí [dependency injection |dependency-injection:passing-dependencies]. V presenterech stačí jen zavolat `$httpResponse = $this->getHttpResponse()`.

→ [Instalace a požadavky |@home#Instalace]


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

Objekt je na rozdíl od [Nette\Http\Request|request] mutable, tedy pomocí setterů můžete měnit stav, tedy např. odesílat hlavičky. Nezapomeňte, že všechny settery musí být volány **před odesláním jakéhokoli výstupu.** Jestli už byl výstup odeslán prozradí metoda `isSent()`. Pokud vrací `true`, každý pokus o odeslání hlavičky vyvolá výjimku `Nette\InvalidStateException`.


setCode(int $code, string $reason=null) .[method]
-------------------------------------------------
Změní stavový [kód odpovědi |https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10]. Kvůli lepší srozumitelnosti zdrojového kódu doporučujeme pro kód používat místo čísel [předdefinované konstanty |api:Nette\Http\IResponse].

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


getCode(): int .[method]
------------------------
Vrací stavový kód odpovědi.


isSent(): bool .[method]
------------------------
Vrací, zda už došlo k odeslání hlaviček ze serveru do prohlížeče, a tedy již není možné odesílat hlavičky či měnit stavový kód.


setHeader(string $name, string $value) .[method]
------------------------------------------------
Odešle HTTP hlavičku a **přepíše** dříve odeslanou hlavičkou stejného jména.

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


addHeader(string $name, string $value) .[method]
------------------------------------------------
Odešle HTTP hlavičku a **nepřepíše** dříve odeslanou hlavičkou stejného jména.

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


deleteHeader(string $name) .[method]
------------------------------------
Smaže dříve odeslanou HTTP hlavičku.


getHeader(string $header): ?string .[method]
--------------------------------------------
Vrací odeslanou HTTP hlavičku nebo `null`, pokud taková neexistuje. Parametr je case-insensitive.

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


getHeaders(): array .[method]
-----------------------------
Vrací všechny odeslané HTTP hlavičky jako asociativní pole.

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


setContentType(string $type, string $charset=null) .[method]
------------------------------------------------------------
Mění hlavičku `Content-Type`.

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


redirect(string $url, int $code=self::S302_FOUND): void .[method]
-----------------------------------------------------------------
Přesměruje na jiné URL. Nezapomeňte poté ukončit skript.

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


setExpiration(?string $time) .[method]
--------------------------------------
Nastaví expiraci HTTP dokumentu pomocí hlaviček `Cache-Control` a `Expires`. Parametrem je buď časový interval (jako text), nebo `null`, což zakáže kešování.

```php
// cache v prohlížeči vyprší za hodinu
$httpResponse->setExpiration('1 hour');
```


sendAsFile(string $fileName) .[method]{data-version:v3.1.1}
-----------------------------------------------------------
Odpověď bude stažena pomocí dialogového okna *Uložit jako* pod uvedeným názvem. Samotný soubor přitom neodesílá.

```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]
--------------------------------------------------------------------------------------------------------------------------------------------------------------
Odešle cookie.

Výchozí hodnoty parametrů od verze 3.1:

| `$path`     | `'/'`   | cookie má dosah na všechny cesty v (sub)doméně *(konfigurovatelné)*
| `$domain`   | `null`  | což znamená s dosahem na aktuální (sub)doménu, ale nikoliv její subdomény *(konfigurovatelné)*
| `$secure`   | `true`  | pokud web běží na HTTPS, jinak `false` *(konfigurovatelné)*
| `$httpOnly` | `true`  | cookie je pro JavaScript nepřístupná
| `$sameSite` | `'Lax'` | cookie nemusí být odeslána při [přístupu z jiné domény|nette:glossary#SameSite cookie]

Výchozí hodnoty parametrů `$path`, `$domain` a `$secure` můžete změnit v [konfiguraci|configuration#HTTP cookie].Výchozí hodnoty parametrů ve verzi 3.0:

| `$path`     | `'/'`   | cookie má dosah na všechny cesty v (sub)doméně
| `$domain`   | `null`  | což znamená s dosahem na aktuální (sub)doménu, ale nikoliv její subdomény
| `$secure`   |         | podle nastavení v [konfiguraci|configuration#HTTP cookie]
| `$httpOnly` | `true`  | cookie je pro JavaScript nepřístupná
| `$sameSite` | `null`  | flag se neodesílá (viz [SameSite cookie|nette:glossary#SameSite cookie])

Čas lze uvádět jako počet sekund nebo řetězec:

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

Parametr `$domain` určuje, které domény mohou cookie přijímat. Není-li uveden, cookie přijímá stejná (sub)doména, jako ji nastavila, ale nikoliv její subdomény. Pokud je `$domain` zadaný, jsou zahrnuty i subdomény. Proto je uvedení `$domain` méně omezující než vynechání. Například při `$domain = 'nette.org'` jsou cookies dostupné i na všech subdoménách jako `doc.nette.org`.

Pro hodnotu `$sameSite` můžete použít konstanty `Response::SAME_SITE_LAX`, `SAME_SITE_STRICT` a `SAME_SITE_NONE`.


deleteCookie(string $name, string $path=null, string $domain=null, bool $secure=null): void .[method]
-----------------------------------------------------------------------------------------------------
Smaže cookie. Výchozí hodnoty parametrů jsou:
- `$path` s dosahem na všechny adresáře (`'/'`)
- `$domain` s dosahem na aktuální (sub)doménu, ale nikoliv její subdomény
- `$secure` se řídí podle nastavení v [konfiguraci|configuration#HTTP cookie]

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

HTTP response

Nette zapouzdřuje HTTP odpověď do objektů se srozumitelným API.

HTTP odpověď představuje objekt Nette\Http\Response, ke kterému se dostanete tak, že si jej necháte předat pomocí dependency injection. V presenterech stačí jen zavolat $httpResponse = $this->getHttpResponse().

Instalace a požadavky

Nette\Http\Response

Objekt je na rozdíl od Nette\Http\Request mutable, tedy pomocí setterů můžete měnit stav, tedy např. odesílat hlavičky. Nezapomeňte, že všechny settery musí být volány před odesláním jakéhokoli výstupu. Jestli už byl výstup odeslán prozradí metoda isSent(). Pokud vrací true, každý pokus o odeslání hlavičky vyvolá výjimku Nette\InvalidStateException.

setCode(int $code, string $reason=null)

Změní stavový kód odpovědi. Kvůli lepší srozumitelnosti zdrojového kódu doporučujeme pro kód používat místo čísel předdefinované konstanty.

$httpResponse->setCode(Nette\Http\Response::S404_NOT_FOUND);

getCode(): int

Vrací stavový kód odpovědi.

isSent(): bool

Vrací, zda už došlo k odeslání hlaviček ze serveru do prohlížeče, a tedy již není možné odesílat hlavičky či měnit stavový kód.

setHeader(string $name, string $value)

Odešle HTTP hlavičku a přepíše dříve odeslanou hlavičkou stejného jména.

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

addHeader(string $name, string $value)

Odešle HTTP hlavičku a nepřepíše dříve odeslanou hlavičkou stejného jména.

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

deleteHeader(string $name)

Smaže dříve odeslanou HTTP hlavičku.

getHeader(string $header): ?string

Vrací odeslanou HTTP hlavičku nebo null, pokud taková neexistuje. Parametr je case-insensitive.

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

getHeaders(): array

Vrací všechny odeslané HTTP hlavičky jako asociativní pole.

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

setContentType(string $type, string $charset=null)

Mění hlavičku Content-Type.

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

redirect(string $url, int $code=self::S302_FOUND)void

Přesměruje na jiné URL. Nezapomeňte poté ukončit skript.

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

setExpiration(?string $time)

Nastaví expiraci HTTP dokumentu pomocí hlaviček Cache-Control a Expires. Parametrem je buď časový interval (jako text), nebo null, což zakáže kešování.

// cache v prohlížeči vyprší za hodinu
$httpResponse->setExpiration('1 hour');

sendAsFile(string $fileName)

Odpověď bude stažena pomocí dialogového okna Uložit jako pod uvedeným názvem. Samotný soubor přitom neodesílá.

$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)

Odešle cookie.

Výchozí hodnoty parametrů od verze 3.1:

$path '/' cookie má dosah na všechny cesty v (sub)doméně (konfigurovatelné)
$domain null což znamená s dosahem na aktuální (sub)doménu, ale nikoliv její subdomény (konfigurovatelné)
$secure true pokud web běží na HTTPS, jinak false (konfigurovatelné)
$httpOnly true cookie je pro JavaScript nepřístupná
$sameSite 'Lax' cookie nemusí být odeslána při přístupu z jiné domény

Výchozí hodnoty parametrů $path, $domain a $secure můžete změnit v konfiguraci.Výchozí hodnoty parametrů ve verzi 3.0:

$path '/' cookie má dosah na všechny cesty v (sub)doméně
$domain null což znamená s dosahem na aktuální (sub)doménu, ale nikoliv její subdomény
$secure   podle nastavení v konfiguraci
$httpOnly true cookie je pro JavaScript nepřístupná
$sameSite null flag se neodesílá (viz SameSite cookie)

Čas lze uvádět jako počet sekund nebo řetězec:

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

Parametr $domain určuje, které domény mohou cookie přijímat. Není-li uveden, cookie přijímá stejná (sub)doména, jako ji nastavila, ale nikoliv její subdomény. Pokud je $domain zadaný, jsou zahrnuty i subdomény. Proto je uvedení $domain méně omezující než vynechání. Například při $domain = 'nette.org' jsou cookies dostupné i na všech subdoménách jako doc.nette.org.

Pro hodnotu $sameSite můžete použít konstanty Response::SAME_SITE_LAX, SAME_SITE_STRICT a SAME_SITE_NONE.

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

Smaže cookie. Výchozí hodnoty parametrů jsou:

  • $path s dosahem na všechny adresáře ('/')
  • $domain s dosahem na aktuální (sub)doménu, ale nikoliv její subdomény
  • $secure se řídí podle nastavení v konfiguraci
$httpResponse->deleteCookie('lang');