Система Zend_Controller
спроектирована быть легковесной,
модульной и расширяемой. Ее минимализм допускает гибкость и некоторую
свободу в использовании, при этом она достаточно структурирована, чтобы
системы, построенные с использованием Zend_Controller
,
использовали некоторые общие соглашения и сходное размещение кода.
Следующая диаграмма отображает рабочий процесс системы, далее подробно описывается их взаимодействие:
Рабочий процесс Zend_Controller
осуществляется несколькими
компонентами. Несмотря на то, что для использования этой системы нет
необходимости в совершенном понимании внутренней работы всех этих
компонент, полезно иметь практическое представление об этом процессе.
Фронт-контроллер (
Zend_Controller_Front
) управляет всем рабочим процессом системыZend_Controller
. Это одна из интерпретаций паттерна FrontController.Zend_Controller_Front
обрабатывает все запросы, полученные сервером, и в конечном счете отвечает за делегацию запросов контроллерам действий (Zend_Controller_Action
).-
Zend_Controller_Request_Abstract
(часто называетсяобъектом запроса
) представляет переменные запроса и предоставляет методы для установки и получения имен контроллера, действия и любых параметров запроса. Кроме того, он отслеживает, было ли обработано содержащееся в нем действие диспетчеромZend_Controller_Dispatcher
. Расширения абстрактного объекта запроса могут использоваться для инкапсуляции всех переменных запроса, позволяя роутерам извлекать информацию из переменных запроса для того, чтобы устанавливать имена контроллера и действия.По умолчанию используется
Zend_Controller_Request_Http
. Он предоставляет доступ ко всем переменным HTTP-запроса. -
Zend_Controller_Router_Interface
используется для описания маршрутизаторов. Маршрутизация — это процесс исследования переменных запроса для определения того, какой контроллер и какое действие в этом контроллере должны получить этот запрос. Эти контроллер, действие и опциональные параметры устанавливаются в объекте запроса для обработки диспетчеромZend_Controller_Dispatcher_Standard
. Маршрутизация производится только один раз: когда вначале получен запрос и до того, как первый контроллер примет управление.Используемый по умолчанию маршрутизатор
Zend_Controller_Router_Rewrite
принимает конечную точку URI в том виде, в котором она определена вZend_Controller_Request_Http
, и разлагает ее на контроллер, действие и параметры, основываясь на пути в URL. Например, URLhttp://localhost/foo/bar/key/value
будет расшифрован следующим образом: контроллерfoo
, действиеbar
и параметрkey
со значениемvalue
.Zend_Controller_Router_Rewrite
может также использоваться для сопоставления с произвольными путями, за более подробной информацией см. документацию по Rewrite Router -
Zend_Controller_Dispatcher_Interface
используется для описания диспетчеров. Диспетчеризация — это процесс извлечения контроллера и действия из объекта запроса, нахождения соответствующих файла/класса контроллера и метода действия в классе контроллера. Ситуации, когда соответствующие контроллер или действие не найдены, решаются определением контроллеров и действий по умолчанию.В действии процесс диспетчеризации состоит из инстанцирования класса контроллера и вызова метода действия в этом классе. В отличие от маршрутизации, которая производится только один раз, диспетчеризация производится циклически. Если флаг диспетчеризации объекта запроса сбрасывается, то цикл будет повторяться, при этом вызывается действие, которое будет установлено на данный момент в объекте запроса. Если итерация цикла завершится с установленным флагом диспетчеризации (значение
true
) в объекте запроса, то процесс диспетчеризации завершается.По умолчанию используется диспетчер
Zend_Controller_Dispatcher_Standard
. Он определяет контроллеры как классы с именами, завершающимися словом Controller, и в которых все слова начинаются со сточной буквы, методы действий — как методы с именами, завершающимися словом Action, и в которых все слова, кроме первого, начинаются со строчной буквы:SomeFooController::barAction
. В этом случае на контроллер нужно ссылаться как наsomefoo
, а на действие как наbar
.Соглашения по именованию Общеизвестно, что в случае ручного набора адресов человек и поддержка чувствительности регистра несовместимы в принципе, поэтому Zend Framework приводит пути в URL к нижнему регистру. Само собой, это влияет на то, как вы именуете свои контроллеры и действия... или ссылаетесь на них в URL.
Если вы хотите иметь классы контроллеров или методы действий с именами, состоящими из нескольких слов с первыми буквами в верхнем регистре (CamelCase), то нужно разделить эти слова в URL с помощью '-' или '.' (но вы можете указать свой символ, используемый в качестве разделителя)
Например, если вы собираетесь использовать действие
FooBarController::bazBatAction()
, то должны ссылаться на него в URL как на/foo-bar/baz-bat
или/foo.bar/baz.bat
Zend_Controller_Action
— базовая составляющая контроллера действий. Каждый контроллер является отдельным классом, расширяющимZend_Controller_Action
, и этот класс должен содержать один или более методов действий.-
Zend_Controller_Response_Abstract
определяет базовый класс ответа, используемый для сбора и возвращения ответов из контроллеров действий. Он собирает как тело ответа, так и заголовки.По умолчанию используется класс
Zend_Controller_Response_Http
, который подходит для использования в среде HTTP.
Рабочий процесс Zend_Controller
относительно простой.
Запрос получается объектом Zend_Controller_Front
,
который в свою очередь вызывает
Zend_Controller_Router_Rewrite
для определения того, какой
контроллер (и какое действие в этом контроллере) следует использовать.
Zend_Controller_Router_Rewrite
анализирует URI для установки имени контроллера и имени действия в
запросе. Затем Zend_Controller_Front
входит в цикл
диспетчеризации. Он вызывает
Zend_Controller_Dispatcher_Standard
, передавая ему
запрос для запуска контроллера и действия, определенных в запросе
(или тех, которые используются по умолчанию). После того, как
контроллер завершит работу, управление возвращается
Zend_Controller_Front
. Если предыдущий контроллер
переустановкой статуса диспетчеризации в запросе
указал, что должен быть запущен другой контроллер, то цикл
продолжается и выполняется запуск другого контроллера. В противном
случае процесс завершается.