Zend_Controller
предоставляет основу для построения веб-сайта, базирующегося на паттерне
Model-View-Controller (MVC).
Система Zend_Controller
задумана как легковесная, модульная и расширяемая. Минималистский
дизайн обеспечивает гибкость и некоторую свободу пользователям и в то же время предоставляет
достаточно структуры, чтобы системы, построенные вокруг Zend_Controller
делили некоторые
общие соглашения и сходный код.
Рабочий процесс Zend_Controller
осуществляется несколькими компонентами. Несмотря на то,
что для использования этой системы нет необходимости в совершенном понимании внутренней работы всех
компонент, полезно иметь практические знания данного процесса.
Zend_Controller_Front
управляет всем рабочим процессом системы
Zend_Controller
. Это интерпретация паттерна FrontController.
Zend_Controller_Front
обрабатывает все запросы, полученные сервером,
и в конечном счете овечает за делегацию запросов "контроллерам действий"
(Zend_Controller_Action
).
Zend_Controller_Router
является маршрутизатором. Маршрутизация -- это
процесс приема конечной точки URI и ее декомпозиции для определения, какой
контроллер и какое действие данного контроллера должны получить запрос. Определение
контроллера, действия и необязательных параметров упаковано в объект значений,
называемый Zend_Controller_Dispatcher_Token
(маркер диспетчеризации).
Далее идет обработка посредством Zend_Controller_Dispatcher
.
Маршрутизация выполняется только один раз: когда вначале получен запрос и перед
тем, как первый контроллер будет запущен.
Zend_Controller_Dispatcher
является диспетчером. Диспетчеризация -- процесс
получения объекта Zend_Controller_Dispatcher_Token
, нахождения соответствующего
файла контроллера, инициализации класса контроллера в этом файле (должен выполнять
Zend_Controller_Action
) и, наконец, запуска метода действия в объекте
контроллера. В отличие от маршрутизации, которая выполняется только один раз, диспетчеризация
выполняется циклически. Zend_Controller_Dispatcher
повторно вызывается
Zend_Controller_Front
до тех пор, все действия не будут последовательно выполнены.
Zend_Controller_Action
является базовой компонентой контроллера. Каждый
контроллер -- отдельный класс, который наследует от класса Zend_Controller_Action
,
и этот класс имеет методы, реализующие действия.
Рабочий процесс Zend_Controller
относительно простой. Запрос принимается
объектом Zend_Controller_Front
, который по очереди вызывает
Zend_Controller_Router
для определения, какой контроллер (и какое действие в этом
контроллере) запускать. Zend_Controller_Router
декомпозирует URI в объект
Zend_Controller_Dispatcher_Token
, который описывает, что запускать.
Затем Zend_Controller_Front
входит в цикл диспетчеризации. Он вызывает
Zend_Controller_Dispatcher
, переданный в объекте
Zend_Controller_Dispatcher_Token
, для запуска нужного контроллера и действия.
После того, как контроллер завершит работу, управление возвращается Zend_Controller_Front
.
Если предыдущий контроллер посредством возвращения нового маркера указал, что должен быть
запущен другой контроллер, то цикл продолжается и выполняется другой запуск. В противном случае
процесс завершается.
Перед тем, как писать свой первый контроллер, надо сначала понять, как работает процесс
маршрутизации, и как это реализовано в Zend_Controller_Router
. Помните,
что рабочий процесс разделен на маршрутизацию, которая выполняется только один раз, и
диспетчеризацию, которая впоследствии выполняется в цикле.
Zend_Controller_Front
вызывает Zend_Controller_Router
для
установки того, какой контроллер (и какое действие внутри этого контроллера) соответствует
данному URI. Zend_Controller_Router
принимает URI и декомпозирует его в объект
значений Zend_Controller_Dispatcher_Token
, который будет передан диспетчеру
(Zend_Controller_Dispatcher
).
Маршрутизатор использует очень простую схему для определения имени контроллера и имени действия в контроллере:
http://framework.zend.com/controller/action/
Обратите внимание, что первый сегмент всегда является именем контроллера, а второй сегмент -- именем действия.
В URI могут быть определены параметры, которые будут переданы контроллеру. Они имеют вид пары ключ/значение:
http://framework.zend.com/controller/action/key1/value1/
Если ничего не размещено в части URI /controller/
, то это будет
"index
". Если ничего не размещено в части URI /action/
,
то это также будет "index
". Следующие примеры иллюстрируют это:
http://framework.zend.com/roadmap/future/ Controller: roadmap Action : future http://framework.zend.com/roadmap/ Controller: roadmap Action : index http://framework.zend.com/ Controller: index Action : index
Замечание | |
---|---|
В настоящее время мы разрабатываем новый маршрутизатор, с механизмом перезаписи URI (URI rewriting), который даст намного более гибкие возможности, что сейчас доступны в маршрутизаторе. Это будет включено в предварительном релизе в очень близком будущем. |
Имя контроллера, имя действия в этом контроллере и необязательные параметры упакованы
в маркер Zend_Controller_Dispatcher_Token
. Этот маркер возвращается для
Zend_Controller_Front
, который тогда входит в цикл "диспетчеризации".
Один раз за весь цикл диспетчеризации маркер будет передан Zend_Controller_Dispatcher
.
Маркер диспетчеризации (dispatch token) -- простой объект значений, который передается между
Zend_Controller_Front
и классами, которые реализуют интерфейсы маршрутизатора и диспетчера.
Он упаковывает в себе определение контроллера, действия и параметров, передаваемых действию.
Имя контроллера доступно через getControllerName()
и setControllerName()
.
Имя действия, вызываемого внутри контроллера, доступно через getActionName()
и setActionName()
.
Параметры, передаваемые данному действию, заключены в ассоциативный массив из пар ключ/значение,
который доступен через getParams()
и setParams()
.