Запросы
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
Вы можете получить доступ к массиву $_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());
}
});
Примечание по безопасности: Всегда проверяйте и очищайте ввод пользователя, особенно при работе с загрузками файлов. Всегда проверяйте типы расширений, которые вы разрешите загружать, но вы также должны проверять "магические байты" файла, чтобы убедиться, что это действительно тип файла, который заявляет пользователь. Есть articles and libraries available to help with this.
Заголовки запроса
Вы можете получить доступ к заголовкам запроса с помощью методов 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']