Cerere HTTP
Nette încapsulează cererea HTTP în obiecte cu un API ușor de înțeles, oferind în același timp un filtru de curățare.
O solicitare HTTP este un obiect Nette\Http\Request, pe
care îl obțineți trecându-l folosind injecția de dependență.
În prezentatori, pur și simplu apelați $httpRequest = $this->getHttpRequest()
.
Ceea ce este important este că Nette, atunci când creează acest obiect, curăță toți parametrii de intrare GET, POST și COOKIE, precum și URL-urile de caractere de control și secvențe UTF-8 invalide. Astfel, puteți continua să lucrați în siguranță cu datele. Datele curățate sunt apoi utilizate în prezentatori și formulare.
Nette\Http\Request
Acest obiect este imuabil. Nu are setori, are doar un singur așa-numit wither withUrl()
, care nu modifică
obiectul, ci returnează o nouă instanță cu o valoare modificată.
withUrl(Nette\Http\UrlScript $url): Nette\Http\Request
Returnează o clonă cu o adresă URL diferită.
getUrl(): Nette\Http\UrlScript
Returnează adresa URL a cererii ca obiect UrlScript.
$url = $httpRequest->getUrl();
echo $url; // https://nette.org/en/documentation?action=edit
echo $url->getHost(); // nette.org
Avertisment: Browserele nu trimit un fragment către server, astfel încât $url->getFragment()
va returna un
șir gol.
getQuery(?string $key=null): string|array|null
Returnează parametrii cererii GET:
$all = $httpRequest->getQuery(); // matrice cu toți parametrii URL
$id = $httpRequest->getQuery('id'); // returnează parametrul GET "id" (sau nul)
getPost(?string $key=null): string|array|null
Returnează parametrii cererii POST:
$all = $httpRequest->getPost(); // matrice cu toți parametrii POST
$id = $httpRequest->getPost('id'); // returnează parametrul POST "id" (sau null)
getFile(string|string[] $key): Nette\Http\FileUpload|array|null
Returnează încărcarea ca obiect Nette\Http\FileUpload:
$file = $httpRequest->getFile('avatar');
if ($file->hasFile()) { // a fost încărcat vreun fișier?
$file->getUntrustedName(); // numele fișierului trimis de utilizator
$file->getSanitizedName(); // numele fără caractere periculoase
}
Specificați un tablou de chei pentru a accesa structura subarborelui.
//<input type="file" name="my-form[details][avatar]" multiple>
$file = $request->getFile(['my-form', 'details', 'avatar']);
Deoarece nu puteți avea încredere în datele din exterior și, prin urmare, nu vă bazați pe forma structurii, această
metodă este mai sigură decât $request->getFiles()['my-form']['details']['avatar']
, care poate da greș.
getFiles(): array
Returnează arborele de fișiere de încărcare într-o structură normalizată, fiecare frunză fiind o instanță a Nette\Http\FileUpload:
$files = $httpRequest->getFiles();
getCookie(string $key): string|array|null
Returnează un cookie sau null
dacă acesta nu există.
$sessId = $httpRequest->getCookie('sess_id');
getCookies(): array
Returnează toate cookie-urile:
$cookies = $httpRequest->getCookies();
getMethod(): string
Returnează metoda HTTP cu care a fost făcută cererea.
echo $httpRequest->getMethod(); // GET, POST, HEAD, PUT
isMethod(string $method): bool
Verifică metoda HTTP cu care a fost efectuată cererea. Parametrul nu ține cont de majuscule și minuscule.
if ($httpRequest->isMethod('GET')) // ...
getHeader(string $header): ?string
Returnează un antet HTTP sau null
dacă acesta nu există. Parametrul nu ține cont de majuscule și
minuscule:
$userAgent = $httpRequest->getHeader('User-Agent');
getHeaders(): array
Returnează toate antetele HTTP ca matrice asociativă:
$headers = $httpRequest->getHeaders();
echo $headers['Content-Type'];
isSecured(): bool
Conexiunea este criptată (HTTPS)? Este posibil să fie necesar să configurați un proxy pentru o funcționalitate corespunzătoare.
isSameSite(): bool
Solicitarea provine de la același (sub)domeniu și este inițiată prin apăsarea unui link? Nette utilizează cookie-ul
_nss
(fost nette-samesite
) pentru a detecta acest lucru.
isAjax(): bool
Este o cerere AJAX?
getRemoteAddress(): ?string
Returnează adresa IP a utilizatorului. Este posibil să fie necesar să configurați un proxy pentru o funcționalitate corespunzătoare.
getRemoteHost(): ?string
Returnează traducerea DNS a adresei IP a utilizatorului. Este posibil să fie necesar să configurați un proxy pentru o funcționalitate corespunzătoare.
getBasicCredentials(): ?string
Returnează acreditările de autentificare HTTP de bază.
[$user, $password] = $httpRequest->getBasicCredentials();
getRawBody(): ?string
Returnează corpul solicitării HTTP:
$body = $httpRequest->getRawBody();
detectLanguage(array $langs): ?string
Detectează limba. Ca parametru $lang
, se trece o matrice de limbi pe care aplicația le acceptă, iar acesta
o returnează pe cea preferată de browser. Nu este vorba de magie, metoda folosește doar antetul Accept-Language
.
Dacă nu se găsește nicio potrivire, se returnează null
.
// Antetul trimis de browser: Accept-Language: cs,en-us;q=0.8,en;q=0.5,sl;q=0.3
$langs = ['hu', 'pl', 'en']; // Limbi acceptate în aplicație
echo $httpRequest->detectLanguage($langs); // en
RequestFactory
Obiectul cererii HTTP curente este creat de Nette\Http\RequestFactory. Dacă scrieți o aplicație care nu utilizează un container DI, creați o cerere după cum urmează:
$factory = new Nette\Http\RequestFactory;
$httpRequest = $factory->fromGlobals();
RequestFactory poate fi configurat înainte de a apela fromGlobals()
. Putem dezactiva toate măsurile de
igienizare a parametrilor de intrare din secvențe UTF-8 invalide folosind $factory->setBinary()
. Și, de
asemenea, să configurăm un server proxy, care este important pentru detectarea corectă a adresei IP a utilizatorului folosind
$factory->setProxy(...)
.
Este posibil să curățăm URL-urile de caracterele care pot intra în ele din cauza sistemelor de comentarii prost implementate pe diverse alte site-uri web prin utilizarea filtrelor:
// eliminați spațiile din cale
$requestFactory->urlFilters['path']['%20'] = '';
// elimină punctul, virgula sau paranteza dreaptă de la sfârșitul URL-ului
$requestFactory->urlFilters['url']['[.,)]$'] = '';
// curăță calea de slash-uri duplicate (filtru implicit)
$requestFactory->urlFilters['path']['/{2,}'] = '/';
Fișiere încărcate
Metoda Nette\Http\Request::getFiles()
returnează un arbore de fișiere încărcate într-o structură
normalizată, fiecare frunză fiind o instanță de Nette\Http\FileUpload. Aceste obiecte încapsulează datele
trimise de către <input type=file>
element de formular.
Structura reflectă denumirea elementelor din HTML. În cel mai simplu exemplu, acesta ar putea fi un singur element de formular cu nume, trimis ca:
<input type="file" name="avatar">
În acest caz, $request->getFiles()
returnează o matrice:
[
'avatar' => /* FileUpload instance */
]
Obiectul FileUpload
este creat chiar dacă utilizatorul nu a încărcat niciun fișier sau dacă încărcarea a
eșuat. Metoda hasFile()
returnează true în cazul în care a fost trimis un fișier:
$request->getFile('avatar')->hasFile();
În cazul unei intrări care utilizează notația de matrice pentru nume:
<input type="file" name="my-form[details][avatar]">
arborele returnat arată astfel:
[
'my-form' => [
'details' => [
'avatar' => /* FileUpload instance */
],
],
]
De asemenea, puteți crea array-uri de fișiere:
<input type="file" name="my-form[details][avatars][] multiple">
În acest caz, structura arată astfel:
[
'my-form' => [
'details' => [
'avatars' => [
0 => /* FileUpload instance */,
1 => /* FileUpload instance */,
2 => /* FileUpload instance */,
],
],
],
]
Cel mai bun mod de a accesa indexul 1 al unei matrice imbricate este după cum urmează:
$file = $request->getFile(['my-form', 'details', 'avatars', 1]);
if ($file instanceof FileUpload) {
// ...
}
Deoarece nu puteți avea încredere în datele din exterior și, prin urmare, nu vă bazați pe forma structurii, această
metodă este mai sigură decât $request->getFiles()['my-form']['details']['avatars'][1]
, care poate
da greș.
Prezentare generală a metodelor FileUpload
hasFile(): bool
Returnează true
dacă utilizatorul a încărcat un fișier.
isOk(): bool
Returnează true
dacă fișierul a fost încărcat cu succes.
getError(): int
Returnează codul de eroare asociat cu fișierul încărcat. Acesta este una dintre constantele UPLOAD_ERR_XXX. În cazul în care fișierul a fost încărcat
cu succes, se returnează UPLOAD_ERR_OK
.
move(string $dest)
Mută un fișier încărcat într-o nouă locație. Dacă fișierul de destinație există deja, acesta va fi suprascris.
$file->move('/path/to/files/name.ext');
getContents(): ?string
Returnează conținutul fișierului încărcat. În cazul în care încărcarea nu a avut succes, se returnează
null
.
getContentType(): ?string
Detectează tipul de conținut MIME al fișierului încărcat pe baza semnăturii acestuia. În cazul în care încărcarea nu
a avut succes sau detectarea a eșuat, se returnează null
.
Necesită extensia PHP fileinfo
.
getUntrustedName(): string
Returnează numele original al fișierului, așa cum a fost transmis de către browser.
Nu aveți încredere în valoarea returnată de această metodă. Un client ar putea trimite un nume de fișier malițios cu intenția de a vă corupe sau de a vă sparge aplicația.
getSanitizedName(): string
Returnează numele de fișier curățat. Acesta conține numai caractere ASCII [a-zA-Z0-9.-]
. Dacă numele nu
conține astfel de caractere, se returnează „necunoscut“. Dacă fișierul este o imagine JPEG, PNG, GIF sau WebP, se
returnează extensia corectă a fișierului.
Necesită extensia PHP fileinfo
.
getSuggestedExtension(): ?string
Returnează extensia de fișier corespunzătoare (fără punct) care corespunde tipului MIME detectat.
Necesită extensia PHP fileinfo
.
getUntrustedFullPath(): string
Returnează calea completă originală, așa cum a fost transmisă de browser în timpul încărcării directorului. Calea completă este disponibilă numai în PHP 8.1 și versiunile ulterioare. În versiunile anterioare, această metodă returnează numele fișierului care nu este de încredere.
Nu aveți încredere în valoarea returnată de această metodă. Un client ar putea trimite un nume de fișier malițios cu intenția de a vă corupe sau de a vă pirata aplicația.
getSize(): int
Returnează dimensiunea fișierului încărcat. În cazul în care încărcarea nu a avut succes, se returnează
0
.
getTemporaryFile(): string
Returnează calea de acces la locația temporară a fișierului încărcat. În cazul în care încărcarea nu a avut succes,
se returnează ''
.
isImage(): bool
Returnează true
în cazul în care fișierul încărcat este o imagine JPEG, PNG, GIF sau WebP. Detectarea se
bazează pe semnătura acestuia. Integritatea întregului fișier nu este verificată. Puteți afla dacă o imagine nu este
coruptă, de exemplu, încercând să o încărcați.
Necesită extensia PHP fileinfo
.
getImageSize(): ?array
Returnează o pereche de [width, height]
cu dimensiunile imaginii încărcate. În cazul în care încărcarea nu
a avut succes sau nu este o imagine validă, se returnează null
.
toImage(): Nette\Utils\Image
Încarcă o imagine sub forma unui obiect Image. În cazul în care
încărcarea nu a avut succes sau nu este o imagine validă, se aruncă o excepție Nette\Utils\ImageException
.