1 <?xml version="1.0" encoding="UTF-8"?>
3 <sect3 id="zend.controller.router.routes.standard">
4 <title>Zend_Controller_Router_Route</title>
7 <classname>Zend_Controller_Router_Route</classname> - стандартный маршрут
8 фреймворка. Он сочетает в себе легкость использования и гибкость
9 определения маршрутов. Каждый маршрут состоит в основном из карты URL
10 (статических и динамических частей (переменных)), и может быть
11 инициализирован со значениями по умолчанию и требованиями к переменным.
15 Давайте представим себе некое приложение, в котором нужно разместить
16 несколько информационных страниц об авторах. Мы хотим, чтобы адрес
17 <code>http://domain.com/author/martel</code> вел
18 на страницу с информацией об авторе с именем "martel". Маршрут для
19 обеспечения такой функциональности может выглядеть следующим образом:
22 <programlisting language="php"><![CDATA[
23 $route = new Zend_Controller_Router_Route(
26 'controller' => 'profile',
27 'action' => 'userinfo'
31 $router->addRoute('user', $route);
35 Первый параметр конструктора <classname>Zend_Controller_Router_Route</classname> -
36 определение маршрута, которое будет сопоставляться с URL. Определения
37 маршрутов содержат статические и динамические части, разделенные
38 символом косой черты ('/'). Статические части являются обычным текстом:
39 <code>author</code>. Динамические части, называемые переменными,
40 помечаются знаком двоеточия в начале имени переменной:
41 <code>:username</code>.
45 <title>Использование символов</title>
47 Текущая реализация позволяет использовать любые (за исключением
48 косой черты) символы в идентификаторе переменной,
49 но сильно рекомендуется использовать в них только символы,
50 допустимые для переменных в php. Есть вероятность, что в
51 будущем реализация изменится, и это может вызвать скрытые ошибки в
57 Этот маршрут должен сработать, когда вы вводите
58 <code>http://domain.com/author/martel</code> в своем броузере, в этом
59 случае все его переменные будут добавлены в объект
60 <classname>Zend_Controller_Request</classname> и будут доступны в вашем
61 контроллере <code>ProfileController</code>.
62 Переменные, возвращаемые в этом примере, могут быть представленые в виде
63 следующего массива пар ключ/значение:
66 <programlisting language="php"><![CDATA[
68 'username' => 'martel',
69 'controller' => 'profile',
70 'action' => 'userinfo'
75 Затем <classname>Zend_Controller_Dispatcher_Standard</classname> должен вызвать
76 метод <code>userinfoAction()</code> вашего класса
77 <code>ProfileController</code> (используется модуль по умолчанию),
78 основываясь на этих значениях. Вы сможете получать эти переменные через
79 методы <code>Zend_Controller_Action::_getParam()</code> или
80 <code>Zend_Controller_Request::getParam()</code>.
83 <programlisting language="php"><![CDATA[
84 public function userinfoAction()
86 $request = $this->getRequest();
87 $username = $request->getParam('username');
89 $username = $this->_getParam('username');
94 Определение маршрута может содержать в себе еще один специальный символ
95 (метасимвол), представленный символом '*'. Он используется для сбора
96 параметров, как в маршруте Module, используемом по умолчанию
97 (пары переменная => значение, определенные в URI). Следующий маршрут
98 приближенно воспроизводит поведение маршрута Module:
101 <programlisting language="php"><![CDATA[
102 $route = new Zend_Controller_Router_Route(
103 ':module/:controller/:action/*',
104 array('module' => 'default')
106 $router->addRoute('default', $route);
109 <sect4 id="zend.controller.router.routes.standard.variable-defaults">
110 <title>Значения переменных по умолчанию</title>
113 Любая переменная в маршруте может иметь значение по умолчанию, для
114 этого используется второй параметр конструктора
115 <classname>Zend_Controller_Router_Route</classname>. Этот параметр является
116 массивом с ключами, представляющими имена переменных, и со
117 значениями в качестве значений переменных по умолчанию:
120 <programlisting language="php"><![CDATA[
121 $route = new Zend_Controller_Router_Route(
123 array('year' => 2006)
125 $router->addRoute('archive', $route);
129 Маршрут выше будет соответствовать URL-ам
130 <code>http://domain.com/archive/2005</code> и
131 <code>http://example.com/archive</code>. В последнем случае
132 переменная year будет иметь начальное значение по умолчанию 2006.
136 В этом примере переменная <code>year</code> будет добавлена в объект запроса.
137 Поскольку не была предоставлена информация для маршрутизации (не
138 определены параметры <code>controller</code> и <code>action</code>), то управление будет
139 передано контроллеру и методу действия, используемым по умолчанию
140 (оба определены в <classname>Zend_Controller_Dispatcher_Abstract</classname>).
141 Для того, чтобы сделать этот пример более полезным, нужно
142 передать действительные контроллер и действие в качестве значений по
146 <programlisting language="php"><![CDATA[
147 $route = new Zend_Controller_Router_Route(
151 'controller' => 'archive',
155 $router->addRoute('archive', $route);
159 В результате будет вызван метод <code>showAction()</code> класса
160 <code>ArchiveController</code>.
165 <sect4 id="zend.controller.router.routes.standard.variable-requirements">
166 <title>Требования к переменным</title>
169 Можно передать конструктору
170 <classname>Zend_Controller_Router_Route</classname> третий параметр, в котором
171 установлены требования к переменным. Они определяются как части
172 регулярных выражений:
175 <programlisting language="php"><![CDATA[
176 $route = new Zend_Controller_Router_Route(
180 'controller' => 'archive',
183 array('year' => '\d+')
185 $router->addRoute('archive', $route);
189 В случае маршрута, определенного таким образом, маршрутизатор будет
190 считать URL соответствующим ему только если переменная year
191 содержит числовые данные - например,
192 <code>http://domain.com/archive/2345</code>. URL вида
193 <code>http://example.com/archive/test</code> не будет
194 соответствовать этому маршруту, вместо этого будет произведен
195 переход к следующему маршруту в цепочке.
199 <sect4 id="zend.controller.router.routes.standard.translated-segments">
200 <title>Переводимые сегменты</title>
203 Стандартный маршрут поддерживает переводимые сегменты. Для того,
204 чтобы использовать эту возможность, нужно как минимум указать,
205 какой переводчик (экземпляр <classname>Zend_Translate</classname>)
206 должен использоваться - одним из следующих способов:
212 Поместить его в реестр с ключом <code>Zend_Translate</code>.
217 Установить через статический метод
218 <classname>Zend_Controller_Router_Route::setDefaultTranslator()</classname>.
223 Передать его конструктору в качестве четвертого параметра.
229 По умолчанию используется локаль, указанная в экземпляре
230 <classname>Zend_Translate</classname>. Для того, чтобы
231 переопределить ее, вы можете установить ее значение (экземпляр
232 <classname>Zend_Locale</classname> или строка с локалью)
233 одним из следующих способов:
239 Поместить ее в реестр с ключом
240 <classname>Zend_Locale</classname>.
245 Установить через статический метод
246 <classname>Zend_Controller_Router_Route::setDefaultLocale()</classname>.
251 Передать ее конструктору в качестве пятого параметра.
256 Передать ее как параметр <code>@locale</code> методу
257 <code>assemble()</code>.
263 Переводимые сегменты делятся на два типа. У статических
264 сегментов в начале ставится один символ <code>@</code>,
265 они будут переведены в соответствии текущей локалью при сборке URL
266 и преобразованы обратно в идентификатор сообщения при сопоставлении
268 У динамических сегментов в начале ставится <code>:@</code>.
269 При сборке URL данный параметр будет переведен и результат перевода
270 будет добавлен на его место.
271 При сопоставлении переведенный параметр из URL будет преобразован
272 обратно в идентификатор сообщения.
276 <title>Идентификаторы сообщений и отдельный языковый файл</title>
278 Может случайно получиться так, что идентификатор сообщения,
279 который вы собираетесь использовать в одном из своих
280 маршрутов, уже используется в ваших скриптах вида или где-то
282 Для того, чтобы иметь полный контроль над вашими
283 URL-ами, следует использовать отдельный языковый файл для
284 сообщений, используемых в маршруте.
289 Следующий пример демонстрирует наиболее простой способ подготовки
290 стандартного маршрута с использованием переводимых сегментов:
293 <programlisting language="php"><![CDATA[
294 // Подготовка переводчика
295 $translator = new Zend_Translate('array', array(), 'en');
296 $translator->addTranslation(array('archive' => 'archiv',
299 'index' => 'uebersicht'),
302 // Установка текущей локали для переводчика
303 $translator->setLocale('en');
305 // Установка его в качестве используемого по умолчанию для маршрутов
306 Zend_Controller_Router_Route::setDefaultTranslator($translator);
310 Этот пример демонстрирует использование статических сегментов:
313 <programlisting language="php"><![CDATA[
315 $route = new Zend_Controller_Router_Route(
318 'controller' => 'archive',
322 $router->addRoute('archive', $route);
324 // Сборка URL в локали, используемой по умолчанию: archive
325 $route->assemble(array());
327 // Сборка URL в немецкой локали: archiv
328 $route->assemble(array());
332 Вы можете использовать динамические сегменты для создания
333 переведенных версий как в случае использования маршрутов основанных
337 <programlisting language="php"><![CDATA[
339 $route = new Zend_Controller_Router_Route(
340 ':@controller/:@action/*',
342 'controller' => 'index',
346 $router->addRoute('archive', $route);
348 // Сборка URL в локали, используемой по умолчанию: archive/index/foo/bar
349 $route->assemble(array('controller' => 'archive', 'foo' => 'bar'));
351 // Сборка URL в немецкой локали: archiv/uebersicht/foo/bar
352 $route->assemble(array('controller' => 'archive', 'foo' => 'bar'));
356 Вы можете также комбинировать статические и динамические сегменты:
359 <programlisting language="php"><![CDATA[
361 $route = new Zend_Controller_Router_Route(
362 '@archive/:@mode/:value',
366 'controller' => 'archive',
369 array('mode' => '(month|year)'
372 $router->addRoute('archive', $route);
374 // Сборка URL в локали, используемой по умолчанию: archive/month/5
375 $route->assemble(array('mode' => 'month', 'value' => '5'));
377 // Сборка URL в немецкой локали: archiv/monat/5
378 $route->assemble(array('mode' => 'month', 'value' => '5', '@locale' => 'de'));