Spec-Zone.ru › CodeIgniter 4

Класс 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]]])
Параметры:
  • $index (string) – Имя переменной/ключа для поиска.
  • $filter (int) – Тип применяемого фильтра. Список фильтров можно найти здесь.
  • $flags (int) – Флаги для применения. Список флагов можно найти здесь.
Возвращает:

$_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]]])
Параметры:
  • $index (string) – Имя переменной/ключа для поиска.
  • $filter (int) – Тип применяемого фильтра. Список фильтров можно найти здесь.
  • $flags (int) – Флаги для применения. Список флагов можно найти здесь.
Возвращает:

$_GET, если параметры не указаны, в противном случае значение GET, если найдено, или null, если нет

Тип возвращаемого значения:

mixed|null

Этот метод идентичен getVar(), только он извлекает данные GET.

getPost([$index = null[, $filter = null[, $flags = null]]])
Параметры:
  • $index (string) – Имя переменной/ключа для поиска.
  • $filter (int) – Тип применяемого фильтра. Список фильтров можно найти здесь.
  • $flags (int) – Флаги для применения. Список флагов можно найти здесь.
Возвращает:

$_POST, если параметры не указаны, в противном случае значение POST, если найдено, или null, если нет

Тип возвращаемого значения:

mixed|null

Этот метод идентичен getVar(), только он извлекает данные POST.

getPostGet([$index = null[, $filter = null[, $flags = null]]])
Параметры:
  • $index (string) – Имя переменной/ключа для поиска.
  • $filter (int) – Тип применяемого фильтра. Список фильтров можно найти здесь.
  • $flags (int) – Флаги для применения. Список флагов можно найти здесь.
Возвращает:

$_POST, если параметры не указаны, в противном случае значение POST, если найдено, или null, если нет

Тип возвращаемого значения:

mixed|null

Этот метод работает примерно так же, как getPost() и getGet(), только объединяет их. Он будет искать данные в потоках POST и GET, сначала в POST, а затем в GET:

$request->getPostGet('field1');
getGetPost([$index = null[, $filter = null[, $flags = null]]])
Параметры:
  • $index (string) – Имя переменной/ключа для поиска.
  • $filter (int) – Тип применяемого фильтра. Список фильтров можно найти здесь.
  • $flags (int) – Флаги для применения. Список флагов можно найти здесь.
Возвращает:

$_POST, если параметры не указаны, в противном случае значение POST, если найдено, или null, если нет

Тип возвращаемого значения:

mixed|null

Этот метод работает примерно так же, как getPost() и getGet(), только объединяет их. Он будет искать данные в потоках POST и GET, сначала в GET, а затем в POST:

$request->getGetPost('field1');
getCookie([$index = null[, $filter = null[, $flags = null]]])
Параметры:
  • $index (mixed) – Имя COOKIE
  • $filter (int) – Тип применяемого фильтра. Список фильтров можно найти здесь.
  • $flags (int) – Флаги для применения. Список флагов можно найти здесь.
Возвращает:

$_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]]])
Параметры:
  • $index (mixed) – Имя значения
  • $filter (int) – Тип применяемого фильтра. Список фильтров можно найти здесь.
  • $flags (int) – Флаги для применения. Список флагов можно найти здесь.
Возвращает:

Значение элемента $_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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API