02 Запрос
Среда Запроса
Каждый 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