1 <?xml version="1.0" encoding="UTF-8"?>
3 <sect1 id="zend.controller.basics">
4 <title>Основы Zend_Controller</title>
7 Система <classname>Zend_Controller</classname> спроектирована быть легковесной,
8 модульной и расширяемой. Ее минимализм допускает гибкость и некоторую
9 свободу в использовании, при этом она достаточно структурирована, чтобы
10 системы, построенные с использованием <classname>Zend_Controller</classname>,
11 использовали некоторые общие соглашения и сходное размещение кода.
15 Следующая диаграмма отображает рабочий процесс системы, далее подробно
16 описывается их взаимодействие:
20 <inlinegraphic width="483" scale="100" align="center" valign="middle"
21 fileref="figures/zend.controller.basics.png" format="PNG" />
25 Рабочий процесс <classname>Zend_Controller</classname> осуществляется несколькими
26 компонентами. Несмотря на то, что для использования этой системы нет
27 необходимости в совершенном понимании внутренней работы всех этих
28 компонент, полезно иметь практическое представление об этом процессе.
34 Фронт-контроллер (<classname>Zend_Controller_Front</classname>)
35 управляет всем рабочим процессом системы
36 <classname>Zend_Controller</classname>. Это одна из интерпретаций
37 паттерна FrontController. <classname>Zend_Controller_Front</classname>
38 обрабатывает все запросы, полученные сервером, и в конечном
39 счете отвечает за делегацию запросов контроллерам действий
40 (<classname>Zend_Controller_Action</classname>).
46 <classname>Zend_Controller_Request_Abstract</classname> (часто
47 называется <code>объектом запроса</code>) представляет
48 переменные запроса и предоставляет методы для установки и
49 получения имен контроллера, действия и любых параметров
50 запроса. Кроме того, он отслеживает, было ли обработано
51 содержащееся в нем действие диспетчером
52 <classname>Zend_Controller_Dispatcher</classname>.
53 Расширения абстрактного объекта запроса могут
54 использоваться для инкапсуляции всех переменных
55 запроса, позволяя роутерам извлекать информацию
56 из переменных запроса для того, чтобы устанавливать имена
57 контроллера и действия.
61 По умолчанию используется
62 <classname>Zend_Controller_Request_Http</classname>. Он
63 предоставляет доступ ко всем переменным HTTP-запроса.
69 <classname>Zend_Controller_Router_Interface</classname>
70 используется для описания маршрутизаторов.
71 Маршрутизация — это процесс исследования переменных запроса
72 для определения того, какой контроллер и какое действие в
73 этом контроллере должны получить этот запрос. Эти
74 контроллер, действие и опциональные параметры
75 устанавливаются в объекте запроса для обработки диспетчером
76 <classname>Zend_Controller_Dispatcher_Standard</classname>.
77 Маршрутизация производится только один раз: когда вначале
78 получен запрос и до того, как первый контроллер примет
83 Используемый по умолчанию маршрутизатор
84 <classname>Zend_Controller_Router_Rewrite</classname> принимает
85 конечную точку URI в том виде, в котором она определена в
86 <classname>Zend_Controller_Request_Http</classname>, и разлагает ее на
87 контроллер, действие и параметры, основываясь на пути в URL.
89 <code>http://localhost/foo/bar/key/value</code>
90 будет расшифрован следующим образом: контроллер
91 <code>foo</code>, действие <code>bar</code> и параметр
92 <code>key</code> со значением <code>value</code>.
96 <classname>Zend_Controller_Router_Rewrite</classname> может также
97 использоваться для сопоставления с произвольными путями,
98 за более подробной информацией см. <link
99 linkend="zend.controller.router">документацию по Rewrite
106 <classname>Zend_Controller_Dispatcher_Interface</classname>
107 используется для описания диспетчеров.
108 Диспетчеризация — это процесс извлечения контроллера и
109 действия из объекта запроса, нахождения соответствующих
110 файла/класса контроллера и метода действия в
111 классе контроллера. Ситуации, когда соответствующие
112 контроллер или действие не найдены, решаются
113 определением контроллеров и действий по умолчанию.
117 В действии процесс диспетчеризации состоит из
118 инстанцирования класса контроллера и вызова метода действия
119 в этом классе. В отличие от маршрутизации, которая
120 производится только один раз, диспетчеризация производится
121 циклически. Если флаг диспетчеризации объекта запроса
122 сбрасывается, то цикл будет повторяться, при этом вызывается
123 действие, которое будет установлено на данный момент в
124 объекте запроса. Если итерация цикла завершится с
125 установленным флагом диспетчеризации (значение
126 <constant>TRUE</constant>) в объекте запроса, то процесс
127 диспетчеризации завершается.
131 По умолчанию используется диспетчер
132 <classname>Zend_Controller_Dispatcher_Standard</classname>.
133 Он определяет контроллеры как классы с именами,
134 завершающимися словом Controller, и в которых все слова
135 начинаются со сточной буквы (MixedCase), методы действий —
136 как методы с именами, завершающимися словом Action, и в
137 которых все слова, кроме первого, начинаются со строчной
139 <code>SomeFooController::barAction</code>.
140 В этом случае на контроллер нужно ссылаться как на
141 <code>somefoo</code>, а на действие как на
146 <title>Соглашения по именованию</title>
149 Общеизвестно, что в случае ручного набора адресов
150 удобство и поддержка чувствительности регистра
151 несовместимы в принципе, поэтому Zend Framework приводит
152 пути в URL к нижнему регистру. Само собой, это влияет на
153 то, как вы именуете свои контроллеры и действия... или
154 ссылаетесь на них в URL.
158 Если вы хотите иметь классы контроллеров или методы
159 действий с именами, состоящими из нескольких слов,
160 разделенных в стиле MixedCase или camelCase, то нужно
161 разделить эти слова в URL с помощью '-' или '.' (можно
162 указать другой символ-разделитель).
166 Например, если вы собираетесь использовать действие
167 <code>FooBarController::bazBatAction()</code>, то должны
168 ссылаться на него в URL как на
169 <code>/foo-bar/baz-bat</code> или
170 <code>/foo.bar/baz.bat</code>.
177 <classname>Zend_Controller_Action</classname> — базовая
178 составляющая контроллера действий. Каждый контроллер
179 является отдельным классом, расширяющим
180 <classname>Zend_Controller_Action</classname>, и этот класс
181 должен содержать один или более методов действий.
187 <classname>Zend_Controller_Response_Abstract</classname>
188 определяет базовый класс ответа, используемый для
189 сбора и возвращения ответов из контроллеров действий.
190 Он собирает как тело ответа, так и заголовки.
194 По умолчанию используется класс
195 <classname>Zend_Controller_Response_Http</classname>, который
196 подходит для использования в среде HTTP.
202 Рабочий процесс <classname>Zend_Controller</classname> относительно простой.
203 Запрос получается объектом <classname>Zend_Controller_Front</classname>,
204 который в свою очередь вызывает
205 <classname>Zend_Controller_Router_Rewrite</classname> для определения того, какой
206 контроллер (и какое действие в этом контроллере) следует использовать.
207 <classname>Zend_Controller_Router_Rewrite</classname>
208 анализирует URI для установки имени контроллера и имени действия в
209 запросе. Затем <classname>Zend_Controller_Front</classname> входит в цикл
210 диспетчеризации. Он вызывает
211 <classname>Zend_Controller_Dispatcher_Standard</classname>, передавая ему
212 запрос для запуска контроллера и действия, определенных в запросе
213 (или тех, которые используются по умолчанию). После того, как
214 контроллер завершит работу, управление возвращается
215 <classname>Zend_Controller_Front</classname>. Если предыдущий контроллер
216 переустановкой статуса диспетчеризации в запросе
217 указал, что должен быть запущен другой контроллер, то цикл
218 продолжается и выполняется запуск другого контроллера. В противном
219 случае процесс завершается.