Запити

Flight інкапсулює HTTP-запит в єдиний об'єкт, який можна отримати за допомогою:

$request = Flight::request();

Типові випадки використання

Коли ви працюєте з запитом у веб-додатку, зазвичай ви захочете витягнути заголовок, або параметр $_GET чи $_POST, або, можливо, сире тіло запиту. Flight надає простий інтерфейс для виконання всіх цих дій.

Ось приклад отримання параметра рядка запиту:

Flight::route('/search', function(){
    $keyword = Flight::request()->query['keyword'];
    echo "You are searching for: $keyword";
    // запит до бази даних або щось інше з $keyword
});

Ось приклад, можливо, форми з методом POST:

Flight::route('POST /submit', function(){
    $name = Flight::request()->data['name'];
    $email = Flight::request()->data['email'];
    echo "You submitted: $name, $email";
    // зберегти в базі даних або щось інше з $name та $email
});

Властивості об'єкта запиту

Об'єкт запиту надає такі властивості:

  • body - Сире тіло HTTP-запиту
  • url - URL, що запитується
  • base - Батьківська підтека URL
  • method - Метод запиту (GET, POST, PUT, DELETE)
  • referrer - URL-адреса, з якої прийшов запит
  • ip - IP-адреса клієнта
  • ajax - Чи є запит AJAX-запитом
  • scheme - Протокол сервера (http, https)
  • user_agent - Інформація про браузер
  • type - Тип вмісту
  • length - Довжина вмісту
  • query - Параметри рядка запиту
  • data - Дані POST або JSON
  • cookies - Дані файлів cookie
  • files - Завантажені файли
  • secure - Чи є з'єднання безпечним
  • accept - Параметри HTTP accept
  • proxy_ip - IP-адреса проксі клієнта. Сканує масив $_SERVER для HTTP_CLIENT_IP, HTTP_X_FORWARDED_FOR, HTTP_X_FORWARDED, HTTP_X_CLUSTER_CLIENT_IP, HTTP_FORWARDED_FOR, HTTP_FORWARDED у такому порядку.
  • host - Ім'я хоста запиту
  • servername - Значення SERVER_NAME з $_SERVER

Ви можете отримати доступ до властивостей query, data, cookies та files як до масивів або об'єктів.

Отже, щоб отримати параметр рядка запиту, ви можете зробити:

$id = Flight::request()->query['id'];

Або ви можете зробити:

$id = Flight::request()->query->id;

Сире тіло запиту

Щоб отримати сире тіло HTTP-запиту, наприклад, при роботі з запитами PUT, ви можете зробити:

$body = Flight::request()->getBody();

JSON-вхід

Якщо ви надсилаєте запит з типом application/json і даними {"id": 123}, це буде доступно з властивості data:

$id = Flight::request()->data->id;

$_GET

Ви можете отримати доступ до масиву $_GET через властивість query:

$id = Flight::request()->query['id'];

$_POST

Ви можете отримати доступ до масиву $_POST через властивість data:

$id = Flight::request()->data['id'];

Ви можете отримати доступ до масиву $_COOKIE через властивість cookies:

$myCookieValue = Flight::request()->cookies['myCookieName'];

$_SERVER

Доступний ярлик для доступу до масиву $_SERVER через метод getVar():

$host = Flight::request()->getVar('HTTP_HOST');

Доступ до завантажених файлів через $_FILES

Ви можете отримати доступ до завантажених файлів через властивість files:

$uploadedFile = Flight::request()->files['myFile'];

Обробка завантажень файлів (v3.12.0)

Ви можете обробляти завантаження файлів за допомогою фреймворку з деякими допоміжними методами. Здебільшого це зводиться до витягування даних файлу з запиту та переміщення його в нове місце.

Flight::route('POST /upload', function(){
    // Якщо у вас є поле вводу типу <input type="file" name="myFile">
    $uploadedFileData = Flight::request()->getUploadedFiles();
    $uploadedFile = $uploadedFileData['myFile'];
    $uploadedFile->moveTo('/path/to/uploads/' . $uploadedFile->getClientFilename());
});

Якщо ви маєте кілька завантажених файлів, ви можете перебрати їх:

Flight::route('POST /upload', function(){
    // Якщо у вас є поле вводу типу <input type="file" name="myFiles[]">
    $uploadedFiles = Flight::request()->getUploadedFiles()['myFiles'];
    foreach ($uploadedFiles as $uploadedFile) {
        $uploadedFile->moveTo('/path/to/uploads/' . $uploadedFile->getClientFilename());
    }
});

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

Заголовки запиту

Ви можете отримати доступ до заголовків запиту за допомогою методу getHeader() або getHeaders():

// Можливо, вам потрібен заголовок Authorization
$host = Flight::request()->getHeader('Authorization');
// або
$host = Flight::request()->header('Authorization');

// Якщо вам потрібно отримати всі заголовки
$headers = Flight::request()->getHeaders();
// або
$headers = Flight::request()->headers();

Тіло запиту

Ви можете отримати доступ до сирого тіла запиту за допомогою методу getBody():

$body = Flight::request()->getBody();

Метод запиту

Ви можете отримати доступ до методу запиту за допомогою властивості method або методу getMethod():

$method = Flight::request()->method; // фактично викликає getMethod()
$method = Flight::request()->getMethod();

Примітка: Метод getMethod() спочатку витягує метод з $_SERVER['REQUEST_METHOD'], потім його можна перезаписати за допомогою $_SERVER['HTTP_X_HTTP_METHOD_OVERRIDE'], якщо він існує, або $_REQUEST['_method'], якщо він існує.

URL запиту

Є кілька допоміжних методів для складання частин URL для вашої зручності.

Повний URL

Ви можете отримати доступ до повного URL запиту за допомогою методу getFullUrl():

$url = Flight::request()->getFullUrl();
// https://example.com/some/path?foo=bar

Базовий URL

Ви можете отримати доступ до базового URL за допомогою методу getBaseUrl():

$url = Flight::request()->getBaseUrl();
// Зауважте, без завершуючого слеша.
// https://example.com

Парсинг запиту

Ви можете передати URL методу parseQuery(), щоб розібрати рядок запиту в асоціативний масив:

$query = Flight::request()->parseQuery('https://example.com/some/path?foo=bar');
// ['foo' => 'bar']