Zend_Controller-Router-Route-Chain.xml 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- Reviewed: no -->
  3. <sect3 id="zend.controller.router.routes.chain">
  4. <title>Zend_Controller_Router_Route_Chain</title>
  5. <para>
  6. <classname>Zend_Controller_Router_Route_Chain</classname>
  7. является маршрутом, который позволяет объединять несколько маршрутов
  8. между собой. Это позволяет, например, объединять маршруты по имени
  9. хоста с маршрутами по пути или несколько маршрутов по пути.
  10. Объединение может быть произведено программным путем или в
  11. конфигурационном файле.
  12. </para>
  13. <note>
  14. <title>Приоритет параметров</title>
  15. <para>
  16. При объединении маршрутов параметры внешнего маршрута имеют
  17. больший приоритет, чем параметры внутреннего маршрута.
  18. Таким образом, если вы определили контроллер одновременно во
  19. внутреннем и внешнем маршрутах, то будет выбран контроллер из
  20. внешнего маршрута.
  21. </para>
  22. </note>
  23. <para>
  24. При объединении маршрутов программным путем есть два способа достижения
  25. этого. Первый состоит в создании нового экземпляра класса
  26. <classname>Zend_Controller_Router_Route_Chain</classname>
  27. и последующем вызове метода <code>chain</code> несколько раз
  28. со всеми маршрутами, которые должны быть объединены между собой.
  29. Другой состоит в том, чтобы брать первый маршрут, например, маршрут по
  30. имени хоста, и вызывать его метод <code>chain</code> с маршрутом,
  31. который должен быть добавлен к нему.
  32. При этом маршрут по имени хоста не изменяется, но будет
  33. возвращен новый экземпляр класса
  34. <classname>Zend_Controller_Router_Route_Chain</classname>, который
  35. объединяет в себе два маршрута:
  36. </para>
  37. <programlisting language="php"><![CDATA[
  38. // Создаются два маршрута
  39. $hostnameRoute = new Zend_Controller_Router_Route_Hostname(...);
  40. $pathRoute = new Zend_Controller_Router_Route(...);
  41. // Первый способ - объединение через маршрут-"цепочку
  42. $chainedRoute = new Zend_Controller_Router_Route_Chain();
  43. $chainedRoute->chain($hostnameRoute)
  44. ->chain($pathRoute);
  45. // Второй способ - непосредственное объединение
  46. $chainedRoute = $hostnameRoute->chain($pathRoute);
  47. ]]></programlisting>
  48. <para>
  49. При объединении маршрутов их разделителем по умолчанию будет
  50. косая черта. Но может понадобиться использовать и другие разделители:
  51. </para>
  52. <programlisting language="php"><![CDATA[
  53. // Создаются два маршрута
  54. $firstRoute = new Zend_Controller_Router_Route('foo');
  55. $secondRoute = new Zend_Controller_Router_Route('bar');
  56. // Объединение с использованием другого разделителя
  57. $chainedRoute = $firstRoute->chain($secondRoute, '-');
  58. // Результирующий маршрут: "foo-bar"
  59. echo $chainedRoute->assemble();
  60. ]]></programlisting>
  61. <sect4 id="zend.controller.router.routes.chain.config">
  62. <title>Объединение маршрутов через Zend_Config</title>
  63. <para>
  64. Для объединения маршрутов в конфигурационном файле есть
  65. дополнительные параметры. Наиболее простой способ состоит в
  66. использовании параметра <code>chains</code>.
  67. Это просто список маршрутов, которые будут
  68. объединены с родительским. Ни родительский, ни дочерний
  69. маршруты не будут добавлены в маршрутизатор напрямую, в него будет
  70. добавлен только составленный из них маршрут. Имя объединенного
  71. маршрута в маршрутизаторе будет состоять из имени родительского
  72. маршрута и имени дочернего маршрута, объединенных с использованием
  73. тире (-). Простая конфигурация в формате XML может выглядеть
  74. следующим образом:
  75. </para>
  76. <programlisting language="xml"><![CDATA[
  77. <routes>
  78. <www type="Zend_Controller_Router_Route_Hostname">
  79. <route>www.example.com</route>
  80. <chains>
  81. <language type="Zend_Controller_Router_Route">
  82. <route>:language</route>
  83. <reqs language="[a-z]{2}">
  84. <chains>
  85. <index type="Zend_Controller_Router_Route_Static">
  86. <route></route>
  87. <defaults module="default" controller="index" action="index" />
  88. </index>
  89. <imprint type="Zend_Controller_Router_Route_Static">
  90. <route>imprint</route>
  91. <defaults module="default" controller="index" action="index" />
  92. </imprint>
  93. </chains>
  94. </language>
  95. </chains>
  96. </www>
  97. <users type="Zend_Controller_Router_Route_Hostname">
  98. <route>users.example.com</route>
  99. <chains>
  100. <profile type="Zend_Controller_Router_Route">
  101. <route>:username</route>
  102. <defaults module="users" controller="profile" action="index" />
  103. </profile>
  104. </chains>
  105. </users>
  106. <misc type="Zend_Controller_Router_Route_Static">
  107. <route>misc</route>
  108. </misc>
  109. </routes>
  110. ]]></programlisting>
  111. <para>
  112. Результатом будет три маршрута: <code>www-language-index</code>,
  113. <code>www-language-imprint</code> и <code>users-language-profile</code>,
  114. которые будут соответствовать только именам хоста, подходящим под
  115. заданные определения, и маршрут <code>misc</code>, который будет
  116. соответствовать любым именам хоста.
  117. </para>
  118. <para>
  119. Альтернативный способ создания объединенных маршрутов состоит в
  120. применении параметра <code>chain</code>,
  121. который может использоваться только с маршрутами типа
  122. <classname>Zend_Controller_Router_Route_Chain</classname>,
  123. эти маршруты указываются на том же уровне, что и остальные:
  124. </para>
  125. <programlisting language="xml"><![CDATA[
  126. <routes>
  127. <www type="Zend_Controller_Router_Route_Chain">
  128. <route>www.example.com</route>
  129. </www>
  130. <language type="Zend_Controller_Router_Route">
  131. <route>:language</route>
  132. <reqs language="[a-z]{2}">
  133. </language>
  134. <index type="Zend_Controller_Router_Route_Static">
  135. <route></route>
  136. <defaults module="default" controller="index" action="index" />
  137. </index>
  138. <imprint type="Zend_Controller_Router_Route_Static">
  139. <route>imprint</route>
  140. <defaults module="default" controller="index" action="index" />
  141. </imprint>
  142. <www-index type="Zend_Controller_Router_Route_Chain">
  143. <chain>www, language, index</chain>
  144. </www-index>
  145. <www-imprint type="Zend_Controller_Router_Route_Chain">
  146. <chain>www, language, imprint</chain>
  147. </www-imprint>
  148. </routes>
  149. ]]></programlisting>
  150. <para>
  151. Вы можете также передавать параметр <code>chain</code> в виде
  152. массива вместо перечисления маршрутов через запятую:
  153. </para>
  154. <programlisting language="xml"><![CDATA[
  155. <routes>
  156. <www-index type="Zend_Controller_Router_Route_Chain">
  157. <chain>www</chain>
  158. <chain>language</chain>
  159. <chain>index</chain>
  160. </www-index>
  161. <www-imprint type="Zend_Controller_Router_Route_Chain">
  162. <chain>www</chain>
  163. <chain>language</chain>
  164. <chain>imprint</chain>
  165. </www-imprint>
  166. </routes>
  167. ]]></programlisting>
  168. </sect4>
  169. </sect3>
  170. <!--
  171. vim:se ts=4 sw=4 et:
  172. -->