Объект запроса - это простой "объект значений"
(value
object), который передается между
Zend_Controller_Front
, маршрутизатором,
диспетчером и контроллерами. Он хранит в себе имена запрошенных
модуля, контроллера, действия и необязательные параметры, а также
остальную среду (переменные) запроса, будь это HTTP, CLI или
PHP-GTK.
Доступ к имени модуля производится через
getModuleName()
иsetModuleName()
.Доступ к имени контроллера производится через
getControllerName()
иsetControllerName()
.Доступ к имени действия производится через
getControllerName()
иsetControllerName()
.Параметры, доступные через действие, являются ассоциативным массивом пар ключ/значение, который извлекается целиком через метод
getParams()
и устанавливается через методsetParams()
. Его элементы можно извлекать и устанавливать по отдельности через те же методыgetParam()
иsetParam()
соответственно.
Методов, которые можно использовать в запросе, может быть больше, в
зависимости от типа запроса. Например, используемый по умолчанию
запрос Zend_Controller_Request_Http
имеет методы для
получения URI запроса, пути в нем, параметров $_GET
и
$_POST
, и т.д.
Объект запроса передается фронт-контроллеру, либо инициализируется в начале процесса диспетчеризации до того, как будет произведена маршрутизация. Он передается всем объектам в цепочке диспетчеризации.
Кроме того, объект запроса очень полезен в тестировании. Разработчик может вручную установить переменные запроса, включая модуль, контроллер, действие, параметры, URI и т.д., и передать объект запроса фронт-контроллеру для проверки процесса выполнения приложения. Если комбинировать его с объектом ответа, то становится возможным тщательное и точное юнит-тестирование приложений MVC.
Zend_Controller_Request_Http
инкапсулирует доступ к
соответствующим значениям, таким, как имя и значение ключа для
переменных контроллера и действия, и все дополнительные
параметры, полученные из URI. Он также позволяет обращаться
к значениям, содержащимся в суперглобальных массивах, как к
своим открытым членам, и управляет текущими базовым URL и URI
запроса. Суперглобальные значения не могут устанавливаться в
объекте запроса, вместо этого используйте методы
setParam/getParam для установки или получения пользовательских
параметров.
Суперглобальные данные | |
---|---|
Когда получаете доступ к суперглобальным данным через
|
Отдельные значения из суперглобальных массивов можно также
получить через открытые методы. Например, необработанное
значение $_POST['user']
может быть получено через
вызов метода getPost('user')
объекта запроса. Эти
методы включают в себя getQuery()
для получения
элементов массива $_GET
и getHeader()
для получения заголовков запроса.
Данные GET и POST | |
---|---|
Будьте осторожны, когда извлекаете данные из объекта запроса, поскольку они совсем не фильтруются. Маршрутизатор и диспетчер производят проверку на допустимость и фильтрацию данных для использования в своих целях, но оставляют их нетронутыми в объекте запроса. |
Извлечение Raw POST данных | |
---|---|
Начиная с версии 1.5.0 вы можете также извлекать данные POST
в том виде, в котором они присутствуют в теле запроса,
используя метод Этот метод в основном полезен для получения содержимого при разработке RESTful приложений. |
Вы можете также устанавливать пользовательские параметры в
объекте запроса, используя setParam()
, и извлекать
их после, используя getParam()
. Маршрутизатор
использует этот функционал для установки параметров,
обнаруженных в URI запроса, в объекте запроса.
getParam() извлекает не только пользовательские параметры | |
---|---|
Если вы хотите извлекать только те параметры, которые
установили через
Кроме этого, начиная с версии 1.5.0, вы можете ограничивать
набор доступных для поиска источников параметров.
|
Причуды Apache | |
---|---|
Если вы используете обработчик ошибок 404 веб-сервера Apache
для передачи приходящих запросов фронт-контроллеру или
используете флаг PT с правилами перезаписи, то нужный вам
URI будет содержаться в
<?php require_once 'Zend/Controller/Request/Apache404.php'; $request = new Zend_Controller_Request_Apache404(); $front->setRequest($request);
Этот класс расширяет
|
Zend_Controller_Request_Http
позволяет использовать
Zend_Controller_Router_Rewrite в поддиректориях.
Zend_Controller_Request_Http попытается автоматически
определить ваш базовый URL и соответствующим образом установить
его.
Например, если вы храните ваш index.php
в
поддиректории /projects/myapp/index.php
веб-сервера, то базовый URL (основа перезаписи) должен быть
установлен в /projects/myapp
. Эта строка будет
удаляться из начала пути до того, как будут производиться поиск
соответствующего маршрута.
Это освобождает от необходимости ее указания в начале каждого
маршрута. Маршрут 'user/:username'
будет
соответствовать URI вида
http://localhost/projects/myapp/user/martel
и
http://example.com/user/martel
.
Определение URL чувствительно к регистру | |
---|---|
Автоматическое определение базового URL чувствительно к регистру, поэтому убедитесь, что ваш URL соответствует имени поддиректории в файловой системе (даже на платформе Windows). Если не соответствует, то будет сгенерировано исключение. |
Если базовый URL определяется некорректно, то вы можете заменить
его своим базовым путем с помощью метода
setBaseUrl()
, который есть в классах
Zend_Http_Request
,
Zend_Controller_Request_Http
и
Zend_Controller_Front
. Легче всего установить его
через Zend_Controller_Front
, который в свою очередь
установит его в объекте запроса. Пример установки своего
базового URL:
<?php /** * Обработка запроса со своим базовым URL через Zend_Controller_Front */ $router = new Zend_Controller_Router_Rewrite(); $controller = Zend_Controller_Front::getInstance(); $controller->setControllerDirectory('./application/controllers') ->setRouter($router) ->setBaseUrl('/projects/myapp'); // установка базового URL! $response = $controller->dispatch();
getMethod()
позволяет определить HTTP-метод
текущего запроса. Кроме этого, есть набор методов, позволяющий
проверить, использовался ли тот или иной HTTP-метод
при произведении текущего запроса. Все они возвращают ответ булевого типа:
isGet()
isPost()
isPut()
isDelete()
isHead()
isOptions()
Эти методы могут использоваться в основном для создания т.н. RESTful-архитектуры.
Zend_Controller_Request_Http
имеет зачаточный метод
для определения запросов AJAX: isXmlHttpRequest()
.
Этот метод проверяет наличие заголовка HTTP-запроса
X-Requested-With
со значением 'XMLHttpRequest'.
Если он найден, то возвращается true
.
На данный момент известно, что этот заголовок по умолчанию отправляется следующими JS-библиотеками:
Prototype/Scriptaculous (и библиотеки, производные от Prototype)
Yahoo! UI Library
jQuery
MochiKit
Большинство AJAX-библиотек позволяет отправлять произвольные
заголовки HTTP-запросов. Если ваша библиотека не отправляет этот
заголовок, то просто добавьте его в качестве заголовка ответа,
чтобы быть уверенным в том, что метод
isXmlHttpRequest()
работает для вас.
Базовый класс запроса, используемый для всех объектов запроса, -
абстрактный класс Zend_Controller_Request_Abstract
.
Он определяет следующие методы:
abstract class Zend_Controller_Request_Abstract { /** * @return string */ public function getControllerName(); /** * @param string $value * @return self */ public function setControllerName($value); /** * @return string */ public function getActionName(); /** * @param string $value * @return self */ public function setActionName($value); /** * @return string */ public function getControllerKey(); /** * @param string $key * @return self */ public function setControllerKey($key); /** * @return string */ public function getActionKey(); /** * @param string $key * @return self */ public function setActionKey($key); /** * @param string $key * @return mixed */ public function getParam($key); /** * @param string $key * @param mixed $value * @return self */ public function setParam($key, $value); /** * @return array */ public function getParams(); /** * @param array $array * @return self */ public function setParams(array $array); /** * @param boolean $flag * @return self */ public function setDispatched($flag = true); /** * @return boolean */ public function isDispatched(); }
Объект запроса является контейнером для переменных запроса. Цепочке контроллеров надо знать только то, как устанавливать и получать контроллер, действие, опциональные параметры и флаг диспетчеризации. По умолчанию объект запроса будет искать в своих параметрах, используя ключи контроллера и действия, для определения текущих контроллера и действия.
Расширяйте этот класс или один из его производных классов, если вам нужен класс запроса, взаимодействующий с определенной средой для получения данных, использующихся в упомянутых выше задачах. Примерами могут быть среда HTTP, среда CLI или PHP-GTK.