Среда Запроса

Каждый HTTP-запрос (как правило, пришедьший из браузера) содержит дополнительную информацию о запросе, такие как данные заголовка, файлы, переменные и т. д. Веб - приложению необходимо проанализировать эти сведения, чтобы обеспечить правильный ответ инициатору запроса.Phalcon\Http\Request инкапсулирует информацию запроса, позволяя получить к нему доступ объектно-ориентированным способом.

<?php

use Phalcon\Http\Request;

// Получение экземпляра запроса
$request = new Request();

// Проверить, был ли запрос сделан методом POST
if ($request->isPost()) {
    // Проверить, был ли запрос сделан с помощью Ajax
    if ($request->isAjax()) {
        echo 'Запрос был сделан с помощью POST и AJAX';
    }
}

Получение Значений

PHP автоматически заполняет суперглобальные массивы $_GET и $_POST dв зависимости от типа запроса. Эти массивы содержат значения, представленные в формах, или параметры, отправленные через URL. Переменные в массивах никогда не очищаются и могут содержать недопустимые символы или даже вредоносный код, что может привести к атакам SQL-инъекции или межсайтового скриптинга (XSS).

Phalcon\Http\Request позволяет получить доступ к значениям, хранящимся в массивах $_REQUEST, $_GET и $_POST , и очистить или отфильтровать их с помощью службы фильтров (по умолчанию Phalcon\Filter). В следующих примерах показано такое же поведение:

<?php

use Phalcon\Filter;

$filter = new Filter();

// Применение фильтра вручную
$email = $filter->sanitize($_POST['user_email'], 'email');

// Применение фильтра к значению вручную
$email = $filter->sanitize($request->getPost('user_email'), 'email');

// Автоматическое применение фильтра
$email = $request->getPost('user_email', 'email');

// Установка значения по умолчанию, если параметр равен null
$email = $request->getPost('user_email', 'email', 'some@example.com');

// Установка значения по умолчанию, если параметр равен null без фильтрации
$email = $request->getPost('user_email', null, 'some@example.com');

Доступ к запросу из контроллеров

Наиболее распространенным местом доступа к среде запросов является действие контроллера. Для доступа к объекту Phalcon\Http\Request с контроллера необходимо использовать public свойство $this->request контроллера:

<?php

use Phalcon\Mvc\Controller;

class PostsController extends Controller
{
    public function indexAction()
    {

    }

    public function saveAction()
    {
        // Проверка, был ли запрос выполнен с помощью POST
        if ($this->request->isPost()) {
            // Access POST data
            $customerName = $this->request->getPost('name');
            $customerBorn = $this->request->getPost('born');
        }
    }
}

Загрузка файлов

Другой распространенной задачей является загрузка файлов. Phalcon\Http\Request предлагает объектно-ориентированный способ решения этой задачи:

<?php

use Phalcon\Mvc\Controller;

class PostsController extends Controller
{
    public function uploadAction()
    {
        // Проверяет, загрузил ли пользователь файлы
        if ($this->request->hasFiles()) {
            $files = $this->request->getUploadedFiles();

            // Печать реальных имен и размеров файлов
            foreach ($files as $file) {
                // Print file details
                echo $file->getName(), ' ', $file->getSize(), '\n';

                // Переместить файл в приложение
                $file->moveTo(
                    'files/' . $file->getName()
                );
            }
        }
    }
}

Каждый объект, возвращаемый Phalcon\Http\Request::getUploadedFiles(), является экземпляром класса Phalcon\Http\Request\File. Использование суперглобального массива $_FILES дает такое же поведение. Phalcon\Http\Request\File инкапсулирует только информацию, связанную с каждым файлом, загруженным с запросом.

Работа с заголовками

Как упоминалось выше, заголовки запросов содержат полезную информацию, которая позволяет нам отправить правильный ответ пользователю. В следующих примерах показано использование этой информации:

<?php

// Получить заголовок Http-X-Requested-With
$requestedWith = $request->getHeader('HTTP_X_REQUESTED_WITH');

if ($requestedWith === 'XMLHttpRequest') {
    echo 'Запрос был сделан с Ajax';
}

// То же, что и выше
if ($request->isAjax()) {
    echo 'Запрос был сделан с Ajax';
}

// Проверить слой запроса
if ($request->isSecure()) {
    echo 'Запрос был выполнен с использованием защищенного слоя';
}

// Получить IP-адрес сервера. то есть. 192.168.0.100
$ipAddress = $request->getServerAddress();

// Получить IP-адрес клиента, т.е. 201.245.53.51
$ipAddress = $request->getClientAddress();

// Получить User Agent (HTTP_USER_AGENT)
$userAgent = $request->getUserAgent();

// Получить предпочтительный приемлемый контент в браузере. т.е. text/xml
$contentType = $request->getAcceptableContent();

// Получить предпочтительную кодировку, принятую браузером. то есть. UTF-8
$charset = $request->getBestCharset();

// Получить предпочтительный язык, настроенный в браузере. то есть. ан-нас
$language = $request->getBestLanguage();

// Проверить, существует ли заголовок
if ($request->hasHeader('my-header')) {
    echo "Mary had a little lamb";
}

События

При использовании HTTP-авторизации заголовок Authorization имеет следующий формат:

Authorization: <type> <credentials>

где <type> - тип аутентификации. Общий тип - Basic. Дополнительные типы аутентификации описаны реестре IANA схем аутентификации и аутентификации для AWS-серверов (AWS4-HMAC-SHA256). В случаях использования 99,99% тип аутентификации:

  • AWS4-HMAC-SHA256
  • Basic
  • Bearer
  • Digest
  • HOBA
  • Mutual
  • Negotiate
  • OAuth
  • SCRAM-SHA-1
  • SCRAM-SHA-256
  • vapid

Вы можете использовать запрос: request:beforeAuthorizationResolve и запросить: request:afterAuthorizationResolve события для выполнения дополнительных операций до или после разрешения разрешения. Требуется пользовательский сопоставитель авторизации.

Пример без использования пользовательского распознавателя авторизации:

<?php

use Phalcon\Http\Request;

$_SERVER['HTTP_AUTHORIZATION'] = 'Enigma Secret';

$request = new Request();
print_r($request->getHeaders());

Результат:

Array
(
    [Authorization] => Enigma Secret
)

Type: Enigma
Credentials: Secret

Пример использования настраиваемого разрешения для разрешения:

<?php

use Phalcon\Di;
use Phalcon\Events\Event;
use Phalcon\Http\Request;
use Phalcon\Events\Manager;

class NegotiateAuthorizationListener
{
    public function afterAuthorizationResolve(Event $event, Request $request, array $data)
    {
        if (empty($data['server']['CUSTOM_KERBEROS_AUTH'])) {
            return false;
        }

        list($type,) = explode(' ', $data['server']['CUSTOM_KERBEROS_AUTH'], 2);

        if (!$type || stripos($type, 'negotiate') !== 0) {
            return false;
        }

        return [
           'Authorization'=> $data['server']['CUSTOM_KERBEROS_AUTH'],
        ];
    }
}

$_SERVER['CUSTOM_KERBEROS_AUTH'] = 'Negotiate a87421000492aa874209af8bc028';

$di = new Di();

$di->set('eventsManager', function () {
    $manager = new Manager();
    $manager->attach('request', new NegotiateAuthorizationListener());

    return $manager;
});

$request = new Request();
$request->setDI($di);

print_r($request->getHeaders());

Результат:

Array
(
    [Authorization] => Negotiate a87421000492aa874209af8bc028
)

Type: Negotiate
Credentials: a87421000492aa874209af8bc028