Глава 4. Zend_Controller

Содержание

4.1. Обзор
4.1.1. Введение
4.1.2. Процесс маршрутизации
4.1.3. Маркер диспетчеризации
4.1.4. Процесс диспетчеризации
4.2. Начало работы
4.2.1. Введение
4.2.2. Конфигурация сервера
4.2.3. Файл загрузки
4.2.4. Структура каталогов
4.2.5. IndexController
4.3. Создание подклассов
4.3.1. Введение
4.3.2. Соглашения
4.3.3. Интерфейс маршрутизатора
4.3.4. Интерфейс диспетчера
4.4. Плагины
4.4.1. Введение

4.1. Обзор

4.1.1. Введение

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. Если предыдущий контроллер посредством возвращения нового маркера указал, что должен быть запущен другой контроллер, то цикл продолжается и выполняется другой запуск. В противном случае процесс завершается.

4.1.2. Процесс маршрутизации

Перед тем, как писать свой первый контроллер, надо сначала понять, как работает процесс маршрутизации, и как это реализовано в 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.

4.1.3. Маркер диспетчеризации

Маркер диспетчеризации (dispatch token) -- простой объект значений, который передается между Zend_Controller_Front и классами, которые реализуют интерфейсы маршрутизатора и диспетчера. Он упаковывает в себе определение контроллера, действия и параметров, передаваемых действию.

  • Имя контроллера доступно через getControllerName() и setControllerName().

  • Имя действия, вызываемого внутри контроллера, доступно через getActionName() и setActionName().

  • Параметры, передаваемые данному действию, заключены в ассоциативный массив из пар ключ/значение, который доступен через getParams() и setParams().

4.1.4. Процесс диспетчеризации

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