HTTP-запит

Nette інкапсулює HTTP-запит в об'єкти зі зрозумілим API, забезпечуючи при цьому фільтр санації.

HTTP-запит представляється об'єктом Nette\Http\Request. Якщо ви працюєте з Nette, цей об'єкт автоматично створюється фреймворком, і ви можете передати його вам за допомогою ін'єкції залежностей. У презентаторах вам просто потрібно викликати метод $this->getHttpRequest(). Якщо ви працюєте поза Nette Framework, ви можете створити об'єкт за допомогою RequestFactory.

Основною перевагою Nette є те, що при створенні об'єкта він автоматично очищає всі вхідні параметри GET, POST, COOKIE, а також URL-адресу від контрольних символів і невірних послідовностей UTF-8. Після цього ви можете спокійно працювати з цими даними. Очищені дані згодом використовуються в презентаціях і формах.

Встановлення та вимоги

Nette\Http\Request

Цей об'єкт є незмінним. У нього немає сеттерів, є тільки один так званий wither withUrl(), який не змінює об'єкт, а повертає новий екземпляр зі зміненим значенням.

withUrl (Nette\Http\UrlScript $url): Nette\Http\Request

Повертає клон з іншим URL.

getUrl(): Nette\Http\UrlScript

Повертає URL запиту у вигляді об'єкта UrlScript.

$url = $httpRequest->getUrl();
echo $url; // https://nette.org/en/documentation?action=edit
echo $url->getHost(); // nette.org

Попередження: Браузери не надсилають фрагмент на сервер, тому $url->getFragment() поверне порожній рядок.

getQuery (?string $key=null): string|array|null

Повертає параметри GET-запиту:

$all = $httpRequest->getQuery(); // масив усіх URL параметрів
$id = $httpRequest->getQuery('id'); // повертає GET-параметр 'id' (або null)

getPost (?string $key=null): string|array|null

Повертає параметри POST-запиту:

$all = $httpRequest->getPost(); // масив усіх POST-параметрів
$id = $httpRequest->getPost('id'); // повертає POST-параметр 'id' (або null)

getFile (string|string[] $key): Nette\Http\FileUpload|array|null

Повертає вивантаження як об'єкт Nette\Http\FileUpload:

$file = $httpRequest->getFile('avatar');
if ($file->hasFile()) { // чи був завантажений якийсь файл?
	$file->getUntrustedName(); // ім'я файлу, відправленого користувачем
	$file->getSanitizedName(); // ім'я без небезпечних символів
}

Вкажіть масив ключів для доступу до структури піддерева.

//<input type="file" name="my-form[details][avatar]" multiple>
$file = $request->getFile(['my-form', 'details', 'avatar']);

Оскільки ви не можете довіряти даним ззовні і тому не покладаєтеся на форму структури, цей метод безпечніший, ніж $request->getFiles()['my-form']['details']['avatar']який може зазнати невдачі.

getFiles(): array

Повертає дерево файлів вивантаження в нормалізованій структурі, кожен аркуш якого є екземпляром Nette\Http\FileUpload:

$files = $httpRequest->getFiles();

getCookie (string $key): string|array|null

Повертає cookie або null, якщо він не існує.

$sessId = $httpRequest->getCookie('sess_id');

getCookies(): array

Повертає всі файли cookie:

$cookies = $httpRequest->getCookies();

getMethod(): string

Повертає метод HTTP, за допомогою якого було зроблено запит.

echo $httpRequest->getMethod(); // GET, POST, HEAD, PUT

isMethod (string $method)bool

Перевіряє метод HTTP, за допомогою якого було зроблено запит. Параметр не чутливий до регістру.

if ($httpRequest->isMethod('GET')) // ...

getHeader (string $header): ?string

Повертає HTTP-заголовок або null, якщо він не існує. Параметр не чутливий до регістру:

$userAgent = $httpRequest->getHeader('User-Agent');

getHeaders(): array

Повертає всі HTTP-заголовки у вигляді асоціативного масиву:

$headers = $httpRequest->getHeaders();
echo $headers['Content-Type'];

isSecured(): bool

Чи зашифровано з'єднання (HTTPS)? Можливо, вам буде потрібно налаштувати проксі-сервер для правильної роботи.

isSameSite(): bool

Запит виходить із того самого (під)домену та ініційований натисканням на посилання? Для визначення цього Nette використовує cookie _nss (раніше nette-samesite).

isAjax(): bool

Це AJAX-запит?

getRemoteAddress(): ?string

Повертає IP-адресу користувача. Для правильної роботи може знадобитися налаштування проксі-сервера.

getRemoteHost(): ?string

Повертає DNS-трансляцію IP-адреси користувача. Для правильної роботи може знадобитися налаштування проксі-сервера.

getBasicCredentials(): ?string

Повертає облікові дані базової HTTP-аутентифікації.

[$user, $password] = $httpRequest->getBasicCredentials();

getRawBody(): ?string

Повертає тіло HTTP-запиту:

$body = $httpRequest->getRawBody();

detectLanguage (array $langs): ?string

Визначає мову. Як параметр $lang ми передаємо масив мов, які підтримує додаток, і він повертає ту, якій віддає перевагу браузер. Це не магія, метод просто використовує заголовок Accept-Language. Якщо збіг не досягнуто, повертається null.

// Заголовок, що надсилається браузером: Accept-Language: cs,en-us;q=0.8,en;q=0.5,sl;q=0.3

$langs = ['hu', 'pl', 'en']; // мови, що підтримуються в застосунку
echo $httpRequest->detectLanguage($langs); // en

RequestFactory

Клас Nette\Http\RequestFactory використовується для створення екземпляра Nette\Http\Request, який представляє поточний HTTP-запит. (Якщо ви працюєте з Nette, об'єкт HTTP-запиту створюється фреймворком автоматично).

$factory = new Nette\Http\RequestFactory;
$httpRequest = $factory->fromGlobals();

Метод fromGlobals() створює об'єкт запиту на основі поточних глобальних змінних PHP ($_GET, $_POST, $_COOKIE, $_FILES і $_SERVER). При створенні об'єкта він автоматично очищає всі вхідні параметри GET, POST, COOKIE, а також URL від контрольних символів і невірних послідовностей UTF-8, що забезпечує безпеку при подальшій роботі з цими даними.

RequestFactory можна налаштувати перед викликом fromGlobals():

  • за допомогою методу $factory->setBinary() можна відключити автоматичне очищення вхідних параметрів від контрольних символів і неприпустимих послідовностей UTF-8.
  • за допомогою методу $factory->setProxy(...) вказується IP-адреса проксі-сервера, яка необхідна для коректного визначення IP-адреси користувача.

RequestFactory дозволяє визначати фільтри, які автоматично перетворюють частини URL-запиту. Ці фільтри видаляють з URL-адрес небажані символи, які могли бути вставлені, наприклад, через некоректну реалізацію систем коментування на різних сайтах:

// видалення пробілів зі шляху
$requestFactory->urlFilters['path']['%20'] = '';

// видалення крапки, коми або правої дужки з кінця URI
$requestFactory->urlFilters['url']['['[.,)]$'] = '';

// очищення шляху від подвійних слешів (фільтр за замовчуванням)
$requestFactory->urlFilters['path']['/{2,}'] = '/';

Перший ключ 'path' або 'url' визначає, до якої частини URL-адреси буде застосовано фільтр. Другий ключ – це регулярний вираз для пошуку, а значення – заміна, яка буде використана замість знайденого тексту.

Завантажені файли

Метод Nette\Http\Request::getFiles() повертає дерево завантажених файлів у нормалізованій структурі, кожен аркуш якого є екземпляром Nette\Http\FileUpload. Ці об'єкти інкапсулюють дані, представлені елементом <input type=file> елементом форми.

Структура відображає іменування елементів у HTML. У найпростішому прикладі це може бути один іменований елемент форми, представлений як:

<input type="file" name="avatar">

У цьому випадку $request->getFiles() повертає масив:

[
	'avatar' => /* FileUpload instance */
]

Об'єкт FileUpload створюється, навіть якщо користувач не завантажив жодного файлу або завантаження не вдалося. Метод hasFile() повертає true, якщо файл було надіслано:

$request->getFile('avatar')->hasFile();

У разі введення з використанням нотації масиву для імені:

<input type="file" name="my-form[details][avatar]">

дерево, що повертається, має такий вигляд:

[
	'my-form' => [
		'details' => [
			'avatar' => /* FileUpload instance */
		],
	],
]

Ви також можете створювати масиви файлів:

<input type="file" name="my-form[details][avatars][] multiple">

У такому разі структура має такий вигляд:

[
	'my-form' => [
		'details' => [
			'avatars' => [
				0 => /* FileUpload instance */,
				1 => /* FileUpload instance */,
				2 => /* FileUpload instance */,
			],
		],
	],
]

Найкращий спосіб доступу до індексу 1 вкладеного масиву такий:

$file = $request->getFile(['my-form', 'details', 'avatars', 1]);
if ($file instanceof FileUpload) {
	// ...
}

Оскільки ви не можете довіряти даним ззовні і тому не покладаєтеся на форму структури, цей метод є безпечнішим, ніж $request->getFiles()['my-form']['details']['avatars'][1]який може не спрацювати.

Огляд методів FileUpload

hasFile(): bool

Повертає true, якщо користувач завантажив файл.

isOk(): bool

Повертає true, якщо файл було завантажено успішно.

getError(): int

Повертає код помилки, пов'язаний із завантаженим файлом. Це може бути одна з констант UPLOAD_ERR_XXX. Якщо файл було завантажено успішно, повертається UPLOAD_ERR_OK.

move (string $dest)

Переміщує завантажений файл у нове місце. Якщо файл призначення вже існує, його буде перезаписано.

$file->move('/path/to/files/name.ext');

getContents(): ?string

Повертає вміст завантаженого файлу. Якщо завантаження не було успішним, повертається null.

getContentType(): ?string

Визначає MIME-тип вмісту завантажуваного файлу на основі його сигнатури. Якщо завантаження не було успішним або визначення не вдалося, повертається null.

Потрібне розширення PHP fileinfo.

getUntrustedName(): string

Повертає вихідне ім'я файлу, передане браузером.

Не довіряйте значенню, що повертається цим методом. Клієнт може надіслати шкідливе ім'я файлу з наміром зіпсувати або зламати ваш додаток.

getSanitizedName(): string

Повертає саніроване ім'я файлу. Воно містить тільки символи ASCII [a-zA-Z0-9.-]. Якщо ім'я не містить таких символів, повертається ‘unknown’. Якщо файл є зображенням JPEG, PNG, GIF або WebP, повертається правильне розширення файлу.

Потрібне розширення PHP fileinfo.

getSuggestedExtension(): ?string

Повертає відповідне розширення файлу (без крапки), що відповідає виявленому MIME-типу.

Вимагає розширення PHP fileinfo.

getUntrustedFullPath(): string

Повертає вихідний повний шлях, вказаний браузером під час завантаження каталогу. Повний шлях доступний тільки в PHP 8.1 і вище. У попередніх версіях цей метод повертає недовірене ім'я файлу.

Не довіряйте значенню, що повертається цим методом. Клієнт може надіслати шкідливе ім'я файлу з наміром зіпсувати або зламати ваш додаток.

getSize(): int

Повертає розмір завантаженого файлу. Якщо завантаження не було успішним, повертається 0.

getTemporaryFile(): string

Повертає шлях до тимчасового місця розташування завантаженого файлу. Якщо завантаження не було успішним, повертається ''.

isImage(): bool

Повертає true, якщо завантажений файл є зображенням JPEG, PNG, GIF або WebP. Виявлення засноване на його сигнатурі. Цілісність усього файлу не перевіряється. Ви можете дізнатися, чи не пошкоджено зображення, наприклад, спробувавши завантажити його.

Потрібне розширення PHP fileinfo.

getImageSize(): ?array

Повертає пару [width, height] з розмірами завантаженого зображення. Якщо завантаження не було успішним або це не дійсне зображення, повертається null.

toImage(): Nette\Utils\Image

Завантажує зображення як об'єкт Image. Якщо завантаження не було успішним або зображення не є дійсним, викидається виняток Nette\Utils\ImageException.

версію: 4.0