Стандартный маршрутизатор

Диспетчер

Обзор

Диспетчеризация — это процесс принятия объекта запроса (Zend_Controller_Request_Abstract), извлечения содержащихся в нем имени модуля, имени контроллера, имени действия и необязательных параметров, затем инстанцирования контроллера и вызова действия в нем. Если не найдены модуль, контроллер или действие, то будут использоваться значения по умолчанию. Zend_Controller_Dispatcher_Standard определяет index как значение по умолчанию для контроллера и действия, и default - для модуля, но позволяет разработчику изменять эти значения, используя setDefaultController(), setDefaultAction() и setDefaultModule(), соответственно.

Note: Модуль, используемый по умолчанию
При создании приложения, состоящего из модулей, вы можете захотеть, чтобы для вашего модуля, используемого по умолчанию, тоже использовалось свое пространство имен (по умолчанию для этого модуля оно не используется). Начиная с версии 1.5.0, вы можете устанавливать параметр prefixDefaultModule в true, используя фронт-контроллер или диспетчер.

  1. // Через фронт-контроллер:
  2. $front->setParam('prefixDefaultModule'// Через диспетчер:
  3. $dispatcher->setParam('prefixDefaultModule'
Это позволяет повторно использовать существующий модуль в качестве используемого по умолчанию в вашем приложении.

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

В начале каждой итерации цикла он устанавливает флаг в объекте запроса, означающий, что действие было запущено. Если действие или методы pre/postDispatch установленного плагина сбросят этот флаг, то цикл диспетчеризации продолжится и будет произведена попытка обработать новый запрос. Изменяя контроллер и/или действие в запросе и сбрасывая флаг диспетчеризации, разработчик может задавать цепочку запросов для обработки.

Метод действия в контроллере, который таким образом управляет диспетчеризацией, называется _forward(); вызывайте этот метод из любых методов pre/postDispatch() или методов действий, указывая действие, контроллер, модуль и опционально любые дополнительные параметры, которые хотите передать новому действию.

  1. span style="color: #808080; font-style: italic;">// переход к другому действию в текущем контроллере и модуле:
  2. 'bar''baz' => 'bogus'// переход к действию в другом контроллере FooController::bazAction()
  3.     // в текущем модуле:
  4. 'baz', 'foo''baz' => 'bogus'// переход к действию в другом контроллере в другом модуле
  5.     // Foo_BarController::bazAction():
  6. 'baz', 'bar', 'foo''baz' => 'bogus'));
  7. }

Создание подклассов диспетчера

Zend_Controller_Front сначала вызывает маршрутизатор для получения первого действия в запросе. Затем он входит в цикл диспетчеризации, в котором вызывается диспетчер для запуска действия.

Диспетчеру для своей работы требуются различные данные - ему нужно "знать", как формировать имена контроллеров и действий, где искать файлы классов контроллеров, является ли допустимым или нет предоставленное имя модуля, и API для определения на основе другой доступной информации того, возможна ли диспетчеризация данного запроса.

Zend_Controller_Dispatcher_Interface определяет следующие методы, которые требуется использовать во всех реализациях диспетчера:

  1. span style="color: #808080; font-style: italic;">/**
  2.      * Формирует из данной строки имя класса контроллера.
  3.      *
  4.      * @param string $unformatted
  5.      * @return string
  6.      *//**
  7.      * Формирует из данной строки имя метода действия.
  8.      *
  9.      * @param string $unformatted
  10.      * @return string
  11.      *//**
  12.      * Определяет, доступен ли для диспетчеризации запрос
  13.      *
  14.      * @param  Zend_Controller_Request_Abstract $request
  15.      * @return boolean
  16.      *//**
  17.      * Устанавливает пользовательский параметр
  18.      * (через фронт-контроллер или для локального использования)
  19.      *
  20.      * @param string $name
  21.      * @param mixed $value
  22.      * @return Zend_Controller_Dispatcher_Interface
  23.      *//**
  24.      * Устанавливает массив пользовательских параметров
  25.      *
  26.      * @param array $params
  27.      * @return Zend_Controller_Dispatcher_Interface
  28.      *//**
  29.      * Возвращает один пользовательский параметр
  30.      *
  31.      * @param string $name
  32.      * @return mixed
  33.      *//**
  34.      * Возвращает все пользовательские параметры
  35.      *
  36.      * @return array
  37.      *//**
  38.      * Очищает весь стек пользовательских параметров
  39.      * или удаляет один пользовательский параметр
  40.      *
  41.      * @param null|string|array один ключ или массив ключей для удаления
  42.      * @return Zend_Controller_Dispatcher_Interface
  43.      *//**
  44.      * Устанавливает объект ответа для использования, если есть
  45.      *
  46.      * @param Zend_Controller_Response_Abstract|null $response
  47.      * @return void
  48.      *//**
  49.      * Возвращает объект ответа, если есть
  50.      *
  51.      * @return Zend_Controller_Response_Abstract|null
  52.      *//**
  53.      * Добавляет директорию в стек директорий контроллеров
  54.      *
  55.      * @param string $path
  56.      * @param string $args
  57.      * @return Zend_Controller_Dispatcher_Interface
  58.      *//**
  59.      * Устанавливает директорию(-ии), в которой хранятся файлы контроллеров
  60.      *
  61.      * @param string|array $dir
  62.      * @return Zend_Controller_Dispatcher_Interface
  63.      *//**
  64.      * Возвращает установленную в данное время директорию(-ии) для поиска
  65.      * файлов контроллеров
  66.      *
  67.      * @return array
  68.      *//**
  69.      * Направляет запрос (модулю/)контроллеру/действию.
  70.      *
  71.      * @param  Zend_Controller_Request_Abstract $request
  72.      * @param  Zend_Controller_Response_Abstract $response
  73.      * @return Zend_Controller_Request_Abstract|boolean
  74.      *//**
  75.      * Валиден или нет данный модуль
  76.      *
  77.      * @param string $module
  78.      * @return boolean
  79.      *//**
  80.      * Возвращает используемое по умолчанию имя модуля
  81.      *
  82.      * @return string
  83.      *//**
  84.      * Возвращает используемое по умолчанию имя контроллера
  85.      *
  86.      * @return string
  87.      *//**
  88.      * Возвращает имя используемого по умолчанию действия
  89.      *
  90.      * @return string
  91.      */

Однако в большинстве случаев вам достаточно будет только расширить абстрактный класс Zend_Controller_Dispatcher_Abstract, в котором уже определены все эти методы или класс Zend_Controller_Dispatcher_Standard для изменения функционала стандартного диспетчера.

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


Стандартный маршрутизатор