Класс IncomingRequest
Класс IncomingRequest предоставляет объектно-ориентированное представление HTTP-запроса от клиента, например, браузера. Он расширяет классы Request и Message и имеет доступ ко всем их методам, помимо методов, перечисленных ниже.
- Доступ к запросу
- Определение типа запроса
- Получение входных данных
- Получение заголовков
- URL запроса
- Загруженные файлы
- Переговоры по содержимому
Доступ к запросу
Экземпляр класса запроса уже заполнен для вас, если текущий класс является потомком CodeIgniter\Controller и к нему можно получить доступ как к свойству класса:
<?php
namespace App\Controllers;
use CodeIgniter\Controller;
class UserController extends Controller
{
public function index()
{
if ($this->request->isAJAX()) {
// ...
}
}
}
Если вы не находитесь внутри контроллера, но всё ещё нуждаетесь в доступе к объекту запроса приложения, вы можете получить его копию через класс Services:
$request = \Config\Services::request();
Однако предпочтительнее передавать запрос в качестве зависимости, если класс — не контроллер, где вы можете сохранить его как свойство класса:
<?php
use CodeIgniter\HTTP\RequestInterface;
class SomeClass
{
protected $request;
public function __construct(RequestInterface $request)
{
$this->request = $request;
}
}
$someClass = new SomeClass(\Config\Services::request());
Определение типа запроса
Запрос может быть нескольких типов, включая AJAX-запрос или запрос из командной строки. Это можно проверить с помощью методов isAJAX() и isCLI():
// Check for AJAX request.
if ($request->isAJAX()) {
// ...
}
// Check for CLI Request
if ($request->isCLI()) {
// ...
}
Примечание
Метод isAJAX() зависит от заголовка X-Requested-With, который в некоторых случаях по умолчанию не отправляется в запросах XHR через JavaScript (например, fetch). Обратитесь к разделу AJAX-запросы для получения информации о том, как избежать этой проблемы.
Вы можете проверить HTTP-метод, который представляет этот запрос, с помощью метода method():
// Returns 'post' $method = $request->getMethod();
По умолчанию метод возвращается в виде строчной буквы (например, «get», «post» и т. д.). Вы можете получить его заглавную версию, обернув вызов в str_to_upper():
// Returns 'GET' $method = str_to_upper($request->getMethod());
Вы также можете проверить, был ли запрос выполнен через соединение HTTPS, с помощью метода isSecure():
if (! $request->isSecure()) {
force_https();
}
Получение входных данных
Вы можете получить входные данные из $_SERVER, $_GET, $_POST и $_ENV через объект Request. Данные не фильтруются автоматически и возвращают исходные входные данные, переданные в запросе. Основные преимущества использования этих методов вместо прямого доступа к ним ($_POST[‘something’]) заключаются в том, что они возвращают null, если элемент не существует, и вы можете отфильтровать данные. Это позволяет удобно использовать данные, не проверяя предварительно существование элемента. Другими словами, обычно вы можете сделать что-то вроде этого:
$something = isset($_POST['foo']) ? $_POST['foo'] : null;
С встроенными методами CodeIgniter вы можете просто сделать это:
$something = $request->getVar('foo');
Метод getVar() извлечёт данные из $_REQUEST, поэтому вернёт любые данные из $_GET, $_POST или $_COOKIE. Хотя это удобно, вам часто потребуется использовать более конкретный метод, например:
$request->getGet()$request->getPost()$request->getServer()$request->getCookie()
Кроме того, есть несколько служебных методов для извлечения информации из $_GET или $_POST, сохраняя возможность управления порядком поиска:
-
$request->getPostGet()— проверяет $_POST в первую очередь, затем $_GET -
$request->getGetPost()— проверяет $_GET в первую очередь, затем $_POST
Получение JSON-данных
Вы можете получить содержимое php://input в виде JSON-потока с помощью getJSON().
Примечание
Этот метод не проверяет, являются ли входные данные корректным JSON или нет. Используйте этот метод только в том случае, если вы знаете, что ожидаете JSON.
$json = $request->getJSON();
По умолчанию это вернёт любые объекты в JSON-данных как объекты. Если вы хотите преобразовать их в ассоциативные массивы, передайте true в качестве первого параметра.
Второй и третий параметры соответствуют аргументам depth и options функции json_decode PHP.
Если входящий запрос имеет заголовок CONTENT_TYPE, установленный на «application/json», вы также можете использовать getVar() для получения JSON-потока. Использование getVar() таким образом всегда вернёт объект.
Получение конкретных данных из JSON
Вы можете получить определённую часть данных из JSON-потока, передав имя переменной в getVar() для данных, которые вам нужны, или вы можете использовать «точечную» нотацию, чтобы получить данные, которые не находятся на корневом уровне.
//With a request body of:
{
"foo": "bar",
"fizz": {
"buzz": "baz"
}
}
$data = $request->getVar('foo');
//$data = "bar"
$data = $request->getVar('fizz.buzz');
//$data = "baz"
Если вы хотите получить результат в виде ассоциативного массива вместо объекта, вы можете использовать getJsonVar() и передать true во второй параметр. Эта функция также может быть использована, если вы не можете гарантировать, что входящий запрос будет иметь правильный заголовок CONTENT_TYPE.
//With the same request as above
$data = $request->getJsonVar('fizz');
//$data->buzz = "baz"
$data = $request->getJsonVar('fizz', true);
//$data = ["buzz" => "baz"]
Примечание
См. документацию по dot_array_search() в хелпере Array для получения дополнительной информации о «точечной» нотации.
Получение исходных данных (PUT, PATCH, DELETE)
Наконец, вы можете получить содержимое php://input как сырой поток с помощью getRawInput():
$data = $request->getRawInput();
Это извлечёт данные и преобразует их в массив. Например так:
var_dump($request->getRawInput());
[
'Param1' => 'Value1',
'Param2' => 'Value2'
]
Фильтрация входных данных
Для обеспечения безопасности вашего приложения вам необходимо отфильтровать все входные данные при доступе к ним. Вы можете передать тип фильтра в качестве второго параметра любого из этих методов. Для фильтрации используется встроенная функция filter_var(). Обратитесь к руководству PHP для получения списка допустимых типов фильтров.
Фильтрация переменной POST будет выглядеть так:
$email = $request->getVar('email', FILTER_SANITIZE_EMAIL);
Все описанные выше методы поддерживают тип фильтра, переданный в качестве второго параметра, за исключением getJSON().
Получение заголовков
Вы можете получить доступ к любому заголовку, отправленному вместе с запросом, с помощью метода headers(), который возвращает массив всех заголовков, где ключ — это имя заголовка, а значение — экземпляр CodeIgniter\HTTP\Header:
var_dump($request->headers());
[
'Host' => CodeIgniter\HTTP\Header,
'Cache-Control' => CodeIgniter\HTTP\Header,
'Accept' => CodeIgniter\HTTP\Header,
]
Если вам нужен только один заголовок, вы можете передать его имя в метод header(). Это извлечёт указанный объект заголовка в случае отсутствия чувствительности к регистру, если он существует. В противном случае вернётся null:
// these are all equivalent
$host = $request->header('host');
$host = $request->header('Host');
$host = $request->header('HOST');
Вы всегда можете использовать hasHeader() для проверки существования заголовка в этом запросе:
if ($request->hasHeader('DNT')) {
// Don't track something...
}
Если вам нужно значение заголовка в виде строки со всеми значениями на одной строке, вы можете использовать метод getHeaderLine():
// Accept-Encoding: gzip, deflate, sdch
echo 'Accept-Encoding: '.$request->getHeaderLine('accept-encoding');
Если вам нужен весь заголовок с именем и значениями в одной строке, просто приведите заголовок к строковому типу:
echo (string)$header;
URL запроса
Вы можете получить объект URI, который представляет текущий URI для этого запроса, через свойство $request->uri. Вы можете привести этот объект к строке, чтобы получить полный URL текущего запроса:
$uri = (string)$request->uri;
Объект даёт вам полные возможности получить любую часть запроса самостоятельно:
$uri = $request->uri; echo $uri->getScheme(); // http echo $uri->getAuthority(); // snoopy:password@example.com:88 echo $uri->getUserInfo(); // snoopy:password echo $uri->getHost(); // example.com echo $uri->getPort(); // 88 echo $uri->getPath(); // /path/to/page echo $uri->getQuery(); // foo=bar&bar=baz echo $uri->getSegments(); // ['path', 'to', 'page'] echo $uri->getSegment(1); // 'path' echo $uri->getTotalSegments(); // 3
Вы можете работать со строкой текущего URI (путь, относительный к вашему baseURL), используя методы getPath() и setPath(). Обратите внимание, что этот относительный путь в общем экземпляре IncomingRequest используется функциями хелпера URL Helper, поэтому это полезный способ «подделать» входящий запрос для тестирования:
class MyMenuTest extends CIUnitTestCase
{
public function testActiveLinkUsesCurrentUrl()
{
service('request')->setPath('users/list');
$menu = new MyMenu();
$this->assertTrue('users/list', $menu->getActiveLink());
}
}
Загруженные файлы
Информация обо всех загруженных файлах может быть получена через $request->getFiles(), который возвращает экземпляр FileCollection. Это помогает упростить работу с загруженными файлами и использует лучшие практики для минимизации любых рисков безопасности.
$files = $request->getFiles();
// Grab the file by name given in HTML form
if ($files->hasFile('uploadedFile')) {
$file = $files->getFile('uploadedfile');
// Generate a new secure name
$name = $file->getRandomName();
// Move the file to it's new home
$file->move('/path/to/dir', $name);
echo $file->getSize('mb'); // 1.23
echo $file->getExtension(); // jpg
echo $file->getType(); // image/jpg
}
Вы можете получить один загруженный файл самостоятельно, на основе имени файла, заданного в файловом поле HTML:
$file = $request->getFile('uploadedfile');
Вы можете получить массив файлов с одинаковыми именами, загруженных в рамках многофайлового загрузки, на основе имени файла, заданного в файловом поле HTML:
$files = $request->getFileMultiple('uploadedfile');
Переговоры по содержимому
Вы можете легко вести переговоры о типах содержимого с запросом через метод negotiate():
$language = $request->negotiate('language', ['en-US', 'en-GB', 'fr', 'es-mx']);
$imageType = $request->negotiate('media', ['image/png', 'image/jpg']);
$charset = $request->negotiate('charset', ['UTF-8', 'UTF-16']);
$contentType = $request->negotiate('media', ['text/html', 'text/xml']);
$encoding = $request->negotiate('encoding', ['gzip', 'compress']);
См. страницу Переговоры по содержимому для получения дополнительной информации.
Справочник по классу
Примечание
Помимо перечисленных здесь методов, этот класс наследует методы из класса Request и класса Message.
Доступные методы родительских классов:
CodeIgniter\HTTP\Request::getIPAddress()CodeIgniter\HTTP\Request::isValidIP()CodeIgniter\HTTP\Request::getMethod()CodeIgniter\HTTP\Request::setMethod()CodeIgniter\HTTP\Request::getServer()CodeIgniter\HTTP\Request::getEnv()CodeIgniter\HTTP\Request::setGlobal()CodeIgniter\HTTP\Request::fetchGlobal()CodeIgniter\HTTP\Message::getBody()CodeIgniter\HTTP\Message::setBody()CodeIgniter\HTTP\Message::appendBody()CodeIgniter\HTTP\Message::populateHeaders()CodeIgniter\HTTP\Message::headers()CodeIgniter\HTTP\Message::header()CodeIgniter\HTTP\Message::hasHeader()CodeIgniter\HTTP\Message::getHeaderLine()CodeIgniter\HTTP\Message::setHeader()CodeIgniter\HTTP\Message::removeHeader()CodeIgniter\HTTP\Message::appendHeader()CodeIgniter\HTTP\Message::prependHeader()CodeIgniter\HTTP\Message::getProtocolVersion()CodeIgniter\HTTP\Message::setProtocolVersion()
-
CodeIgniter\HTTP\IncomingRequest -
-
isCLI() -
Возвращает: True, если запрос был инициирован из командной строки, в противном случае false. Тип возвращаемого значения: bool
-
isAJAX() -
Возвращает: True, если запрос — AJAX-запрос, в противном случае false. Тип возвращаемого значения: bool
-
isSecure() -
Возвращает: True, если запрос — HTTPS-запрос, в противном случае false. Тип возвращаемого значения: bool
-
getVar([$index = null[, $filter = null[, $flags = null]]]) -
Параметры: Возвращает: $_REQUEST, если параметры не указаны, в противном случае значение REQUEST, если найдено, или null, если нет
Тип возвращаемого значения: mixed|null
Первый параметр будет содержать имя элемента REQUEST, который вы ищете:
$request->getVar('some_data');Метод возвращает null, если искомый элемент не существует.
Второй необязательный параметр позволяет выполнить фильтрацию данных с помощью фильтров PHP. Передайте желаемый тип фильтра во второй параметр:
$request->getVar('some_data', FILTER_SANITIZE_STRING);Чтобы вернуть массив всех элементов POST, вызовите метод без параметров.
Чтобы вернуть все элементы POST и пропустить их через фильтр, установите первый параметр в null, а второй — в нужный вам фильтр:
$request->getVar(null, FILTER_SANITIZE_STRING); // returns all POST items with string sanitation
Чтобы вернуть массив нескольких параметров POST, передайте все необходимые ключи в виде массива:
$request->getVar(['field1', 'field2']);
То же правило применяется здесь, чтобы получить параметры с фильтрацией, установите второй параметр в тип фильтра, который нужно применить:
$request->getVar(['field1', 'field2'], FILTER_SANITIZE_STRING);
-
getGet([$index = null[, $filter = null[, $flags = null]]]) -
Параметры: Возвращает: $_GET, если параметры не указаны, в противном случае значение GET, если найдено, или null, если нет
Тип возвращаемого значения: mixed|null
Этот метод идентичен
getVar(), только он извлекает данные GET.
-
getPost([$index = null[, $filter = null[, $flags = null]]]) -
Параметры: Возвращает: $_POST, если параметры не указаны, в противном случае значение POST, если найдено, или null, если нет
Тип возвращаемого значения: mixed|null
Этот метод идентичен
getVar(), только он извлекает данные POST.
-
getPostGet([$index = null[, $filter = null[, $flags = null]]]) -
Параметры: Возвращает: $_POST, если параметры не указаны, в противном случае значение POST, если найдено, или null, если нет
Тип возвращаемого значения: mixed|null
Этот метод работает примерно так же, как
getPost()иgetGet(), только объединяет их. Он будет искать данные в потоках POST и GET, сначала в POST, а затем в GET:$request->getPostGet('field1');
-
getGetPost([$index = null[, $filter = null[, $flags = null]]]) -
Параметры: Возвращает: $_POST, если параметры не указаны, в противном случае значение POST, если найдено, или null, если нет
Тип возвращаемого значения: mixed|null
Этот метод работает примерно так же, как
getPost()иgetGet(), только объединяет их. Он будет искать данные в потоках POST и GET, сначала в GET, а затем в POST:$request->getGetPost('field1');
-
getCookie([$index = null[, $filter = null[, $flags = null]]]) -
Параметры: Возвращает: $_COOKIE, если параметры не указаны, в противном случае значение COOKIE, если найдено, или null, если нет
Тип возвращаемого значения: mixed
Этот метод идентичен
getPost()иgetGet(), только он извлекает данные cookie:$request->getCookie('some_cookie'); $request->getCookie('some_cookie', FILTER_SANITIZE_STRING); // with filterЧтобы вернуть массив нескольких значений cookie, передайте все необходимые ключи в виде массива:
$request->getCookie(['some_cookie', 'some_cookie2']);
Примечание
В отличие от функции Cookie Helper
get_cookie(), этот метод НЕ добавляет префикс вашего настроенного значения$config['cookie_prefix'].
-
getServer([$index = null[, $filter = null[, $flags = null]]]) -
Параметры: Возвращает: Значение элемента $_SERVER, если найдено, или null, если нет
Тип возвращаемого значения: mixed
Этот метод идентичен методам
getPost(),getGet()иgetCookie(), только он извлекает данные getServer ($_SERVER):$request->getServer('some_data');Чтобы вернуть массив нескольких значений
$_SERVER, передайте все необходимые ключи в виде массива.$request->getServer(['SERVER_PROTOCOL', 'REQUEST_URI']);
-
-
getUserAgent([$filter = null]) -
Параметры: - $filter (int) – Тип фильтра для применения. Список фильтров можно найти здесь.
Возвращает: Строка User Agent, найденная в данных SERVER, или null, если не найдена.
Тип возвращаемого значения: mixed
Этот метод возвращает строку User Agent из данных SERVER:
$request->getUserAgent();
-
getPath() -
Возвращает: Текущий путь URI относительно $_SERVER['SCRIPT_NAME']Тип возвращаемого значения: string Это самый безопасный метод для определения «текущего URI», так как
IncomingRequest::$uriможет не знать полной конфигурации приложения для базовых URL.
-
setPath($path) -
Параметры: - $path (string) – Относительный путь, который следует использовать в качестве текущего URI
Возвращает: Этот входящий запрос
Тип возвращаемого значения: IncomingRequest
Этот метод используется в основном для целей тестирования. Он позволяет установить значение относительного пути для текущего запроса вместо того, чтобы полагаться на определение URI. Он также обновит экземпляр
URIс новым путем.
-
© 2014–2020 British Columbia Institute of Technology
Licensed under the MIT License.
https://codeigniter.com/user_guide/incoming/incomingrequest.html