1 <?xml version="1.0" encoding="UTF-8"?>
3 <sect3 id="zend.controller.router.routes.chain">
4 <title>Zend_Controller_Router_Route_Chain</title>
7 <classname>Zend_Controller_Router_Route_Chain</classname>
8 является маршрутом, который позволяет объединять несколько маршрутов
9 между собой. Это позволяет, например, объединять маршруты по имени
10 хоста с маршрутами по пути или несколько маршрутов по пути.
11 Объединение может быть произведено программным путем или в
12 конфигурационном файле.
16 <title>Приоритет параметров</title>
18 При объединении маршрутов параметры внешнего маршрута имеют
19 больший приоритет, чем параметры внутреннего маршрута.
20 Таким образом, если вы определили контроллер одновременно во
21 внутреннем и внешнем маршрутах, то будет выбран контроллер из
27 При объединении маршрутов программным путем есть два способа достижения
28 этого. Первый состоит в создании нового экземпляра класса
29 <classname>Zend_Controller_Router_Route_Chain</classname>
30 и последующем вызове метода <code>chain</code> несколько раз
31 со всеми маршрутами, которые должны быть объединены между собой.
32 Другой состоит в том, чтобы брать первый маршрут, например, маршрут по
33 имени хоста, и вызывать его метод <code>chain</code> с маршрутом,
34 который должен быть добавлен к нему.
35 При этом маршрут по имени хоста не изменяется, но будет
36 возвращен новый экземпляр класса
37 <classname>Zend_Controller_Router_Route_Chain</classname>, который
38 объединяет в себе два маршрута:
41 <programlisting language="php"><![CDATA[
42 // Создаются два маршрута
43 $hostnameRoute = new Zend_Controller_Router_Route_Hostname(...);
44 $pathRoute = new Zend_Controller_Router_Route(...);
46 // Первый способ - объединение через маршрут-"цепочку
47 $chainedRoute = new Zend_Controller_Router_Route_Chain();
48 $chainedRoute->chain($hostnameRoute)
51 // Второй способ - непосредственное объединение
52 $chainedRoute = $hostnameRoute->chain($pathRoute);
56 При объединении маршрутов их разделителем по умолчанию будет
57 косая черта. Но может понадобиться использовать и другие разделители:
60 <programlisting language="php"><![CDATA[
61 // Создаются два маршрута
62 $firstRoute = new Zend_Controller_Router_Route('foo');
63 $secondRoute = new Zend_Controller_Router_Route('bar');
65 // Объединение с использованием другого разделителя
66 $chainedRoute = $firstRoute->chain($secondRoute, '-');
68 // Результирующий маршрут: "foo-bar"
69 echo $chainedRoute->assemble();
72 <sect4 id="zend.controller.router.routes.chain.config">
73 <title>Объединение маршрутов через Zend_Config</title>
76 Для объединения маршрутов в конфигурационном файле есть
77 дополнительные параметры. Наиболее простой способ состоит в
78 использовании параметра <code>chains</code>.
79 Это просто список маршрутов, которые будут
80 объединены с родительским. Ни родительский, ни дочерний
81 маршруты не будут добавлены в маршрутизатор напрямую, в него будет
82 добавлен только составленный из них маршрут. Имя объединенного
83 маршрута в маршрутизаторе будет состоять из имени родительского
84 маршрута и имени дочернего маршрута, объединенных с использованием
85 тире (-). Простая конфигурация в формате XML может выглядеть
89 <programlisting language="xml"><![CDATA[
91 <www type="Zend_Controller_Router_Route_Hostname">
92 <route>www.example.com</route>
94 <language type="Zend_Controller_Router_Route">
95 <route>:language</route>
96 <reqs language="[a-z]{2}">
98 <index type="Zend_Controller_Router_Route_Static">
100 <defaults module="default" controller="index" action="index" />
102 <imprint type="Zend_Controller_Router_Route_Static">
103 <route>imprint</route>
104 <defaults module="default" controller="index" action="index" />
110 <users type="Zend_Controller_Router_Route_Hostname">
111 <route>users.example.com</route>
113 <profile type="Zend_Controller_Router_Route">
114 <route>:username</route>
115 <defaults module="users" controller="profile" action="index" />
119 <misc type="Zend_Controller_Router_Route_Static">
126 Результатом будет три маршрута: <code>www-language-index</code>,
127 <code>www-language-imprint</code> и <code>users-language-profile</code>,
128 которые будут соответствовать только именам хоста, подходящим под
129 заданные определения, и маршрут <code>misc</code>, который будет
130 соответствовать любым именам хоста.
134 Альтернативный способ создания объединенных маршрутов состоит в
135 применении параметра <code>chain</code>,
136 который может использоваться только с маршрутами типа
137 <classname>Zend_Controller_Router_Route_Chain</classname>,
138 эти маршруты указываются на том же уровне, что и остальные:
141 <programlisting language="xml"><![CDATA[
143 <www type="Zend_Controller_Router_Route_Chain">
144 <route>www.example.com</route>
146 <language type="Zend_Controller_Router_Route">
147 <route>:language</route>
148 <reqs language="[a-z]{2}">
150 <index type="Zend_Controller_Router_Route_Static">
152 <defaults module="default" controller="index" action="index" />
154 <imprint type="Zend_Controller_Router_Route_Static">
155 <route>imprint</route>
156 <defaults module="default" controller="index" action="index" />
159 <www-index type="Zend_Controller_Router_Route_Chain">
160 <chain>www, language, index</chain>
162 <www-imprint type="Zend_Controller_Router_Route_Chain">
163 <chain>www, language, imprint</chain>
169 Вы можете также передавать параметр <code>chain</code> в виде
170 массива вместо перечисления маршрутов через запятую:
173 <programlisting language="xml"><![CDATA[
175 <www-index type="Zend_Controller_Router_Route_Chain">
177 <chain>language</chain>
180 <www-imprint type="Zend_Controller_Router_Route_Chain">
182 <chain>language</chain>
183 <chain>imprint</chain>