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()
.
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_NotFound);
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ů:
$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.
Č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::SameSiteLax
, SameSiteStrict
a SameSiteNone
.
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');