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().