Demande HTTP
Nette encapsule la requête HTTP dans des objets avec une API compréhensible tout en fournissant un filtre de désinfection.
La requête HTTP est représentée par l'objet Nette\Http\Request. Si vous travaillez avec Nette, cet objet
est automatiquement créé par le cadre et vous pouvez vous le faire passer en utilisant l'injection de dépendance. Dans les présentateurs,
il suffit d'appeler la méthode $this->getHttpRequest()
. Si vous travaillez en dehors du cadre Nette, vous pouvez
créer l'objet à l'aide de RequestFactory.
L'un des principaux avantages de Nette est que, lors de la création de l'objet, il nettoie automatiquement tous les paramètres d'entrée GET, POST, COOKIE ainsi que les URL des caractères de contrôle et des séquences UTF-8 non valides. Vous pouvez alors travailler en toute sécurité avec ces données. Les données assainies sont ensuite utilisées dans les présentateurs et les formulaires.
Nette\Http\Request
Cet objet est immuable. Il n'a pas de setters, il n'a qu'un seul appelé wither withUrl()
, qui ne change pas
l'objet, mais renvoie une nouvelle instance avec une valeur modifiée.
withUrl (Nette\Http\UrlScript $url): Nette\Http\Request
Renvoie un clone avec une URL différente.
getUrl(): Nette\Http\UrlScript
Renvoie l'URL de la demande sous forme d'objet UrlScript.
$url = $httpRequest->getUrl();
echo $url; // https://nette.org/en/documentation?action=edit
echo $url->getHost(); // nette.org
Attention : Les navigateurs n'envoient pas de fragment au serveur, de sorte que $url->getFragment()
renvoie une
chaîne vide.
getQuery (?string $key=null): string|array|null
Renvoie les paramètres de la requête GET :
$all = $httpRequest->getQuery(); // tableau de tous les paramètres URL
$id = $httpRequest->getQuery('id'); // renvoie le paramètre GET 'id' (ou null)
getPost (?string $key=null): string|array|null
Renvoie les paramètres de la demande POST :
$all = $httpRequest->getPost(); // tableau de tous les paramètres POST
$id = $httpRequest->getPost('id'); // renvoie le paramètre POST 'id' (ou null)
getFile (string|string[] $key): Nette\Http\FileUpload|array|null
Renvoie le téléchargement en tant qu'objet Nette\Http\FileUpload:
$file = $httpRequest->getFile('avatar');
if ($file->hasFile()) { // un fichier a-t-il été téléchargé ?
$file->getUntrustedName(); // nom du fichier envoyé par l'utilisateur
$file->getSanitizedName(); // le nom sans les caractères dangereux
}
Spécifier un tableau de clés pour accéder à la structure du sous-arbre.
//<input type="file" name="my-form[details][avatar]" multiple>
$file = $request->getFile(['my-form', 'details', 'avatar']);
Étant donné que vous ne pouvez pas faire confiance aux données de l'extérieur et que vous ne vous fiez donc pas à la forme
de la structure, cette méthode est plus sûre que la méthode
$request->getFiles()['my-form']['details']['avatar']
qui peut échouer.
getFiles(): array
Renvoie l'arbre des fichiers de téléchargement dans une structure normalisée, avec chaque feuille une instance de Nette\Http\FileUpload:
$files = $httpRequest->getFiles();
getCookie (string $key): string|array|null
Renvoie un cookie ou null
s'il n'existe pas.
$sessId = $httpRequest->getCookie('sess_id');
getCookies(): array
Renvoie tous les cookies :
$cookies = $httpRequest->getCookies();
getMethod(): string
Renvoie la méthode HTTP avec laquelle la demande a été effectuée.
echo $httpRequest->getMethod(); // GET, POST, HEAD, PUT
isMethod (string $method): bool
Vérifie la méthode HTTP avec laquelle la demande a été faite. Le paramètre n'est pas sensible à la casse.
if ($httpRequest->isMethod('GET')) // ...
getHeader (string $header): ?string
Renvoie un en-tête HTTP ou null
s'il n'existe pas. Le paramètre est insensible à la casse :
$userAgent = $httpRequest->getHeader('User-Agent');
getHeaders(): array
Renvoie tous les en-têtes HTTP sous forme de tableau associatif :
$headers = $httpRequest->getHeaders();
echo $headers['Content-Type'];
isSecured(): bool
La connexion est-elle cryptée (HTTPS) ? Vous devrez peut-être configurer un proxy pour une bonne fonctionnalité.
isSameSite(): bool
La demande provient-elle du même (sous) domaine et est-elle initiée par un clic sur un lien ? Nette utilise le cookie
_nss
(anciennement nette-samesite
) pour le détecter.
isAjax(): bool
S'agit-il d'une requête AJAX ?
getRemoteAddress(): ?string
Renvoie l'adresse IP de l'utilisateur. Il se peut que vous deviez configurer un proxy pour une bonne fonctionnalité.
getRemoteHost(): ?string
Renvoie la traduction DNS de l'adresse IP de l'utilisateur. Il se peut que vous deviez configurer un proxy pour une bonne fonctionnalité.
getBasicCredentials(): ?string
Renvoie les informations d'authentification HTTP de base.
[$user, $password] = $httpRequest->getBasicCredentials();
getRawBody(): ?string
Renvoie le corps de la requête HTTP :
$body = $httpRequest->getRawBody();
detectLanguage (array $langs): ?string
Détection de la langue. En tant que paramètre $lang
, nous passons un tableau des langues que l'application prend
en charge, et la méthode renvoie la langue préférée du navigateur. Ce n'est pas de la magie, la méthode utilise simplement
l'en-tête Accept-Language
. Si aucune correspondance n'est trouvée, elle renvoie null
.
// En-tête envoyé par le navigateur: Accept-Language: cs,en-us;q=0.8,en;q=0.5,sl;q=0.3
$langs = ['hu', 'pl', 'en']; // Langues supportées par l'application
echo $httpRequest->detectLanguage($langs); // en
RequestFactory
La classe Nette\Http\RequestFactory est
utilisée pour créer une instance de Nette\Http\Request
, qui représente la requête HTTP en cours. (Si vous
travaillez avec Nette, l'objet requête HTTP est automatiquement créé par le framework).
$factory = new Nette\Http\RequestFactory;
$httpRequest = $factory->fromGlobals();
La méthode fromGlobals()
crée un objet de requête basé sur les variables globales PHP actuelles
($_GET
, $_POST
, $_COOKIE
, $_FILES
et $_SERVER
). Lors de la
création de l'objet, elle nettoie automatiquement tous les paramètres d'entrée GET, POST, COOKIE ainsi que l'URL des
caractères de contrôle et des séquences UTF-8 non valides, ce qui garantit la sécurité lors de l'utilisation ultérieure de
ces données.
RequestFactory peut être configuré avant d'appeler fromGlobals()
:
- la méthode
$factory->setBinary()
permet de désactiver le nettoyage automatique des paramètres d'entrée des caractères de contrôle et des séquences UTF-8 non valides. - la méthode
$factory->setProxy(...)
permet de spécifier l'adresse IP du serveur proxy, nécessaire à la détection correcte de l'adresse IP de l'utilisateur.
RequestFactory vous permet de définir des filtres qui transforment automatiquement certaines parties de la demande d'URL. Ces filtres suppriment les caractères indésirables des URL qui peuvent avoir été insérés, par exemple, en raison d'une mauvaise mise en œuvre des systèmes de commentaires sur différents sites web :
// suppression des espaces dans le chemin
$requestFactory->urlFilters['path']['%20'] = '';
// suppression d'un point, d'une virgule ou d'une parenthèse droite à la fin de l'URI
$requestFactory->urlFilters['url']['[.,)]$'] = '';
// nettoyer le chemin d'accès des doubles barres obliques (filtre par défaut)
$requestFactory->urlFilters['path']['/{2,}'] = '/';
La première clé 'path'
ou 'url'
détermine la partie de l'URL à laquelle le filtre sera appliqué.
La deuxième clé est une expression régulière à rechercher, et la valeur est le remplacement à utiliser à la place du texte
trouvé.
Fichiers téléchargés
La méthode Nette\Http\Request::getFiles()
renvoie un arbre de fichiers téléchargés dans une structure
normalisée, chaque feuille étant une instance de Nette\Http\FileUpload. Ces objets encapsulent les données
soumises par l'élément de formulaire <input type=file>
élément de formulaire.
La structure reflète la dénomination des éléments en HTML. Dans l'exemple le plus simple, il pourrait s'agir d'un seul élément de formulaire nommé soumis comme suit :
<input type="file" name="avatar">
Dans ce cas, le site $request->getFiles()
renvoie un tableau :
[
'avatar' => /* FileUpload instance */
]
L'objet FileUpload
est créé même si l'utilisateur n'a pas envoyé de fichier ou si l'envoi a échoué. La
méthode hasFile()
renvoie vrai si un fichier a été envoyé :
$request->getFile('avatar')->hasFile();
Dans le cas d'une entrée utilisant la notation tableau pour le nom :
<input type="file" name="my-form[details][avatar]">
l'arbre retourné finit par ressembler à ceci :
[
'my-form' => [
'details' => [
'avatar' => /* FileUpload instance */
],
],
]
Vous pouvez également créer des tableaux de fichiers :
<input type="file" name="my-form[details][avatars][] multiple">
Dans ce cas, la structure ressemble à :
[
'my-form' => [
'details' => [
'avatars' => [
0 => /* FileUpload instance */,
1 => /* FileUpload instance */,
2 => /* FileUpload instance */,
],
],
],
]
La meilleure façon d'accéder à l'indice 1 d'un tableau imbriqué est la suivante :
$file = $request->getFile(['my-form', 'details', 'avatars', 1]);
if ($file instanceof FileUpload) {
// ...
}
Parce que vous ne pouvez pas faire confiance aux données de l'extérieur et donc ne pas vous fier à la forme de la structure,
cette méthode est plus sûre que $request->getFiles()['my-form']['details']['avatars'][1]
qui peut échouer.
Aperçu des méthodes de FileUpload
hasFile(): bool
Renvoie true
si l'utilisateur a téléchargé un fichier.
isOk(): bool
Renvoie true
si le fichier a été téléchargé avec succès.
getError(): int
Renvoie le code d'erreur associé au fichier téléchargé. Il s'agit de l'une des constantes UPLOAD_ERR_XXX. Si le fichier a été téléchargé avec
succès, il renvoie UPLOAD_ERR_OK
.
move (string $dest)
Déplace un fichier téléchargé vers un nouvel emplacement. Si le fichier de destination existe déjà, il sera écrasé.
$file->move('/path/to/files/name.ext');
getContents(): ?string
Renvoie le contenu du fichier téléchargé. Si le téléchargement n'a pas réussi, il renvoie null
.
getContentType(): ?string
Détecte le type de contenu MIME du fichier téléchargé en se basant sur sa signature. Si le téléchargement n'a pas réussi
ou si la détection a échoué, il renvoie null
.
Nécessite l'extension PHP fileinfo
.
getUntrustedName(): string
Renvoie le nom du fichier original tel que soumis par le navigateur.
Ne vous fiez pas à la valeur renvoyée par cette méthode. Un client pourrait envoyer un nom de fichier malveillant dans le but de corrompre ou de pirater votre application.
getSanitizedName(): string
Renvoie le nom de fichier aseptisé. Il ne contient que des caractères ASCII [a-zA-Z0-9.-]
. Si le nom ne contient
pas de tels caractères, il renvoie “inconnu”. Si le fichier est une image JPEG, PNG, GIF ou WebP, il renvoie l'extension de
fichier correcte.
Requiert l'extension PHP fileinfo
.
getSuggestedExtension(): ?string
Renvoie l'extension de fichier appropriée (sans le point) correspondant au type MIME détecté.
Requiert l'extension PHP fileinfo
.
getUntrustedFullPath(): string
Renvoie le chemin complet d'origine tel qu'il a été soumis par le navigateur lors du téléchargement du répertoire. Le chemin complet n'est disponible qu'à partir de la version 8.1 de PHP. Dans les versions précédentes, cette méthode renvoie le nom du fichier non fiable.
Ne faites pas confiance à la valeur renvoyée par cette méthode. Un client pourrait envoyer un nom de fichier malveillant dans le but de corrompre ou de pirater votre application.
getSize(): int
Renvoie la taille du fichier téléchargé. Si le téléchargement n'a pas réussi, il renvoie 0
.
getTemporaryFile(): string
Renvoie le chemin de l'emplacement temporaire du fichier téléchargé. Si le téléchargement n'a pas réussi, il renvoie
''
.
isImage(): bool
Renvoie true
si le fichier téléchargé est une image JPEG, PNG, GIF ou WebP. La détection est basée sur sa
signature. L'intégrité de l'ensemble du fichier n'est pas vérifiée. Vous pouvez savoir si une image n'est pas corrompue, par
exemple en essayant de la charger.
Nécessite l'extension PHP fileinfo
.
getImageSize(): ?array
Retourne une paire de [width, height]
avec les dimensions de l'image téléchargée. Si le téléchargement n'a
pas réussi ou si l'image n'est pas valide, il renvoie null
.
toImage(): Nette\Utils\Image
Charge une image sous la forme d'un objet Image. Si le chargement n'a pas
réussi ou s'il ne s'agit pas d'une image valide, il lève une exception Nette\Utils\ImageException
.