Réponse HTTP
Nette encapsule la réponse HTTP dans des objets avec une API compréhensible.
La réponse HTTP est représentée par l'objet Nette\Http\Response. Si vous travaillez avec Nette, cet
objet est automatiquement créé par le framework et vous pouvez vous le faire passer via l'injection de dépendances. Dans les presenters, il
suffit d'appeler la méthode $this->getHttpResponse()
.
Nette\Http\Response
L'objet, contrairement à Nette\Http\Request, est mutable, c'est-à-dire
qu'à l'aide de setters, vous pouvez modifier l'état, par exemple envoyer des en-têtes. N'oubliez pas que tous les setters
doivent être appelés avant l'envoi de toute sortie. La méthode isSent()
indique si la sortie a déjà été
envoyée. Si elle retourne true
, toute tentative d'envoi d'un en-tête lèvera une exception
Nette\InvalidStateException
.
setCode (int $code, ?string $reason=null)
Modifie le code de statut de la réponse. Pour une meilleure lisibilité du code source, nous recommandons d'utiliser des constantes prédéfinies pour le code au lieu de chiffres.
$httpResponse->setCode(Nette\Http\Response::S404_NotFound);
getCode(): int
Retourne le code de statut de la réponse.
isSent(): bool
Retourne si les en-têtes ont déjà été envoyés du serveur au navigateur, et donc s'il n'est plus possible d'envoyer des en-têtes ou de modifier le code de statut.
setHeader (string $name, string $value)
Envoie un en-tête HTTP et écrase un en-tête précédemment envoyé du même nom.
$httpResponse->setHeader('Pragma', 'no-cache');
addHeader (string $name, string $value)
Envoie un en-tête HTTP et n'écrase pas un en-tête précédemment envoyé du même nom.
$httpResponse->addHeader('Accept', 'application/json');
$httpResponse->addHeader('Accept', 'application/xml');
deleteHeader (string $name)
Supprime un en-tête HTTP précédemment envoyé.
getHeader (string $header): ?string
Retourne un en-tête HTTP envoyé ou null
s'il n'existe pas. Le paramètre est insensible à la casse.
$pragma = $httpResponse->getHeader('Pragma');
getHeaders(): array
Retourne tous les en-têtes HTTP envoyés sous forme de tableau associatif.
$headers = $httpResponse->getHeaders();
echo $headers['Pragma'];
setContentType (string $type, ?string $charset=null)
Modifie l'en-tête Content-Type
.
$httpResponse->setContentType('text/plain', 'UTF-8');
redirect (string $url, int $code=self::S302_Found): void
Redirige vers une autre URL. N'oubliez pas de terminer ensuite le script.
$httpResponse->redirect('http://example.com');
exit;
setExpiration (?string $time)
Définit l'expiration du document HTTP à l'aide des en-têtes Cache-Control
et Expires
. Le
paramètre est soit un intervalle de temps (sous forme de texte), soit null
, ce qui désactive la mise en cache.
// le cache du navigateur expirera dans une heure
$httpResponse->setExpiration('1 hour');
sendAsFile (string $fileName)
La réponse sera téléchargée via la boîte de dialogue Enregistrer sous sous le nom spécifié. Le fichier lui-même n'est pas envoyé.
$httpResponse->sendAsFile('facture.pdf');
setCookie (string $name, string $value, $time, ?string $path=null, ?string $domain=null, ?bool $secure=null, ?bool $httpOnly=null, ?string $sameSite=null)
Envoie un cookie. Valeurs par défaut des paramètres :
$path |
'/' |
le cookie a une portée sur tous les chemins du (sous-)domaine (configurable) |
$domain |
null |
ce qui signifie avec une portée sur le (sous-)domaine actuel, mais pas ses sous-domaines (configurable) |
$secure |
true |
si le site fonctionne en HTTPS, sinon false (configurable) |
$httpOnly |
true |
le cookie est inaccessible à JavaScript |
$sameSite |
'Lax' |
le cookie peut ne pas être envoyé lors d'un accès depuis un domaine différent |
Vous pouvez modifier les valeurs par défaut des paramètres $path
, $domain
et $secure
dans la configuration.
Le temps peut être spécifié en secondes ou sous forme de chaîne de caractères :
$httpResponse->setCookie('lang', 'fr', '100 days');
Le paramètre $domain
détermine quels domaines peuvent accepter le cookie. S'il n'est pas spécifié, le cookie
est accepté par le même (sous-)domaine qui l'a défini, mais pas par ses sous-domaines. Si $domain
est spécifié,
les sous-domaines sont également inclus. Par conséquent, spécifier $domain
est moins restrictif que de l'omettre.
Par exemple, avec $domain = 'nette.org'
, les cookies sont également disponibles sur tous les sous-domaines comme
doc.nette.org
.
Pour la valeur $sameSite
, vous pouvez utiliser les constantes Response::SameSiteLax
,
Response::SameSiteStrict
et Response::SameSiteNone
.
deleteCookie (string $name, ?string $path=null, ?string $domain=null, ?bool $secure=null): void
Supprime un cookie. Les valeurs par défaut des paramètres sont :
$path
avec une portée sur tous les répertoires ('/'
)$domain
avec une portée sur le (sous-)domaine actuel, mais pas ses sous-domaines$secure
est régi par les paramètres de la configuration
$httpResponse->deleteCookie('lang');