Запросы в Yii 2
Запросы в Yii 2

Запросы

Запросы, сделанные к приложению, представлены в терминах [[yii\web\Request]] объектов, которые предоставляют информацию о параметрах запроса, HTTP заголовках, cookies и т.д. Для получения доступа к текущему запросу вы должны обратиться к объекту request application component, который по умолчанию является экземпляром [[yii\web\Request]].



Параметры запроса

Чтобы получить параметры запроса, вы должны вызвать методы [[yii\web\Request::get()|get()]] и [[yii\web\Request::post()|post()]] компонента request. Они возвращают значения переменных $_GET и $_POST соответственно. Например,

$request = Yii::$app->request;

$get = $request->get(); 
// эквивалентно: $get = $_GET;

$id = $request->get('id');   
// эквивалентно: $id = isset($_GET['id']) ? $_GET['id'] : null;

$id = $request->get('id', 1);   
// эквивалентно: $id = isset($_GET['id']) ? $_GET['id'] : 1;

$post = $request->post(); 
// эквивалентно: $post = $_POST;

$name = $request->post('name');   
// эквивалентно: $name = isset($_POST['name']) ? $_POST['name'] : null;

$name = $request->post('name', '');   
// эквивалентно: $name = isset($_POST['name']) ? $_POST['name'] : '';

Info: Вместо того, чтобы обращаться напрямую к переменным $_GET и $_POST для получения параметров запроса, рекомендуется чтобы вы обращались к ним через компонент request как было показано выше. Это упростит написание тестов, поскольку вы можете создать mock компонент запроса с не настоящими данными запроса.

При реализации RESTful API, зачастую вам требуется получить параметры, которые были отправлены через PUT, PATCH или другие методы запроса. Вы можете получить эти параметры, вызвав метод [[yii\web\Request::getBodyParam()]]. Например,

$request = Yii::$app->request;

// возвращает все параметры
$params = $request->bodyParams;

// возвращает параметр "id"
$param = $request->getBodyParam('id');

Info: В отличии от GET параметров, параметры, которые были переданы через POST, PUT, PATCH и д.р. отправляются в теле запроса. Компонент request будет обрабатывать эти параметры, когда вы попробуете к ним обратиться через методы, описанные выше. Вы можете настроить способ обработки этих параметров через настройку свойства [[yii\web\Request::parsers]].

Методы запроса

Вы можете получить названия HTTP метода, используемого в текущем запросе, обратившись к выражению Yii::$app->request->method. Также имеется целый набор логических свойств для проверки соответствует ли текущий метод определённому типу запроса. Например,

$request = Yii::$app->request;

if ($request->isAjax) { /* текущий запрос является AJAX запросом */ }
if ($request->isGet)  { /* текущий запрос является GET запросом */ }
if ($request->isPost) { /* текущий запрос является POST запросом */ }
if ($request->isPut)  { /* текущий запрос является PUT запросом */ }

URL запроса

Компонент request предоставляет множество способов изучения текущего запрашиваемого URL.

Если предположить, что URL запроса будет http://example.com/admin/index.php/product?id=100, то вы можете получить различные части этого адреса так как это показано ниже:

  • [[yii\web\Request::url|url]]: вернёт адрес /admin/index.php/product?id=100, который содержит URL без информации об имени хоста.
  • [[yii\web\Request::absoluteUrl|absoluteUrl]]: вернёт адрес http://example.com/admin/index.php/product?id=100, который содержит полный URL, включая имя хоста.
  • [[yii\web\Request::hostInfo|hostInfo]]: вернёт адрес http://example.com, который содержит только имя хоста.
  • [[yii\web\Request::pathInfo|pathInfo]]: вернёт адрес /product, который содержит часть между адресом начального скрипта и параметрами запроса, которые идут после знака вопроса.
  • [[yii\web\Request::queryString|queryString]]: вернёт адрес id=100, который содержит часть URL после знака вопроса.
  • [[yii\web\Request::baseUrl|baseUrl]]: вернёт адрес /admin, который является частью URL после информации о хосте и перед именем входного скрипта.
  • [[yii\web\Request::scriptUrl|scriptUrl]]: вернёт адрес /admin/index.php, который содержит URL без информации о хосте и параметрах запроса.
  • [[yii\web\Request::serverName|serverName]]: вернёт адрес example.com, который содержит имя хоста в URL.
  • [[yii\web\Request::serverPort|serverPort]]: вернёт 80, что является адресом порта, который использует веб-сервер.

HTTP заголовки

Вы можете получить информацию о HTTP заголовках через [[yii\web\HeaderCollection|header collection]], возвращаемыми свойством [[yii\web\Request::headers]]. Например,

// переменная $headers является объектом yii\web\HeaderCollection 
$headers = Yii::$app->request->headers;

// возвращает значения заголовка Accept
$accept = $headers->get('Accept');

if ($headers->has('User-Agent')) { /* в запросе есть заголовок User-Agent */ }

Компонент request также предоставляет доступ к некоторым часто используемым заголовкам, включая

  • [[yii\web\Request::userAgent|userAgent]]: возвращает значение заголовка User-Agent.
  • [[yii\web\Request::contentType|contentType]]: возвращает значение заголовка Content-Type, который указывает на MIME тип данных в теле запроса.
  • [[yii\web\Request::acceptableContentTypes|acceptableContentTypes]]: возвращает список MIME типов данных, которые принимаются пользователем. Возвращаемый список типов будет отсортирован по показателю качества. Типы с более высокими показателями будут первыми в списке.
  • [[yii\web\Request::acceptableLanguages|acceptableLanguages]]: возвращает языки, которые поддерживает пользователь. Список языков будет отсортирован по уровню предпочтения. Наиболее предпочитаемый язык будет первым в списке.

Если ваше приложение поддерживает множество языков и вы хотите показать страницу на языке, который предпочитает пользователь, то вы можете воспользоваться языковым методом согласования (negotiation) [[yii\web\Request::getPreferredLanguage()]]. Этот метод принимает список поддерживаемых языков в вашем приложении, сравнивает их с [[yii\web\Request::acceptableLanguages|acceptableLanguages]] и возвращает наиболее подходящий язык.

Tip: Вы также можете использовать фильтр [[yii\filters\ContentNegotiator|ContentNegotiator]] для динамического определения какой тип содержимого и язык должен использоваться в ответе. Фильтр реализует согласование содержимого на основе свойств и методов, описанных выше.

Информация о клиенте

Вы можете получить имя хоста и IP адрес пользователя через свойства [[yii\web\Request::userHost|userHost]] и [[yii\web\Request::userIP|userIP]] соответственно. Например,

$userHost = Yii::$app->request->userHost;
$userIP = Yii::$app->request->userIP;

Доверенные прокси и заголовки

В предыдущем разделе вы видели, как получить информацию о пользователе, такую как хост и IP-адрес. Это будет работать из коробки в обычной установке, где один веб-сервер используется для обслуживания веб-сайта. Однако если ваше приложение работает за обратным прокси-сервером, вам нужно дополнить конфигурацию, поскольку клиентом теперь является прокси-сервер, а IP-адрес пользователя передаётся приложению с помощью заголовка, установленного им.

Вы не должны слепо доверять заголовкам, предоставленным прокси, если вы явно не доверяете прокси. Начиная с 2.0.13, Yii поддерживает настройку доверенных прокси через следующие свойства компонента request: [[yii\web\Request::trustedHosts|trustedHosts]], [[yii\web\Request::secureHeaders|secureHeaders]], [[yii\web\Request::ipHeaders|ipHeaders]] и [[yii\web\Request::secureProtocolHeaders|secureProtocolHeaders]]

Ниже приведена конфигурация компонента request для приложения, которое работает за рядом обратных прокси, которые расположены в IP-сети 10.0.2.0/24:

'request' => [
    // ...
    'trustedHosts' => [
        '10.0.2.0/24',
    ],
],

IP-адрес, по умолчанию, отправляется прокси-сервером в заголовке X-Forwarded-For, а протокол (http или https) отправляется в X-Forwarded-Proto. Если ваши прокси используют другие заголовки, вы можете использовать конфигурацию компонента request для их настройки, например:

'request' => [
    // ...
    'trustedHosts' => [
        '10.0.2.0/24' => [
            'X-ProxyUser-Ip',
            'Front-End-Https',
        ],
    ],
    'secureHeaders' => [
        'X-Forwarded-For',
        'X-Forwarded-Host',
        'X-Forwarded-Proto',
        'X-Proxy-User-Ip',
        'Front-End-Https',
    ],
    'ipHeaders' => [
        'X-Proxy-User-Ip',
    ],
    'secureProtocolHeaders' => [
        'Front-End-Https' => ['on']
    ],
],

В приведенной выше конфигурации все заголовки, перечисленные в secureHeaders, отфильтровываются из запроса, кроме заголовков X-ProxyUser-Ip и Front-End-Https в случае, если запрос создан прокси. В этом случае, первый используется для получения IP-адреса пользователя, настроенного в ipHeaders, а последний будет использоваться для определения результата [[yii\web\Request::getIsSecureConnection()]].

Заберите ссылку на статью к себе, чтобы потом легко её найти!
Раз уж досюда дочитали, то может может есть желание рассказать об этом месте своим друзьям, знакомым и просто мимо проходящим?
Не надо себя сдерживать! ;)

Старт! Горячий старт на просторы интернета
Старт! Горячий старт на просторы интернета
Старт! Меню