Zend_Controller-Router-Route.xml 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. <sect3 id="zend.controller.router.routes.standard">
  2. <title>Zend_Controller_Router_Route</title>
  3. <para>
  4. <code>Zend_Controller_Router_Route</code> - стандартный маршрут
  5. фреймворка. Он сочетает в себе легкость использования и гибкость
  6. определения маршрутов. Каждый маршрут состоит в основном из карты URL
  7. (статических и динамических частей (переменных)), и может быть
  8. инициализирован со значениями по умолчанию и требованиями к переменным.
  9. </para>
  10. <para>
  11. Давайте представим себе некое приложение, в котором нужно разместить
  12. несколько информационных страниц об авторах. Мы хотим, чтобы адрес
  13. <code>http://domain.com/author/martel</code> вел
  14. на страницу с информацией об авторе с именем "martel". Маршрут для
  15. обеспечения такой функциональности может выглядеть следующим образом:
  16. </para>
  17. <programlisting role="php"><![CDATA[
  18. $route = new Zend_Controller_Router_Route(
  19. 'author/:username',
  20. array(
  21. 'controller' => 'profile',
  22. 'action' => 'userinfo'
  23. )
  24. );
  25. $router->addRoute('user', $route);
  26. ]]>
  27. </programlisting>
  28. <para>
  29. Первый параметр конструктора <code>Zend_Controller_Router_Route</code> -
  30. определение маршрута, которое будет сопоставляться с URL. Определения
  31. маршрутов содержат статические и динамические части, разделенные
  32. символом косой черты ('/'). Статические части являются обычным текстом:
  33. <code>author</code>. Динамические части, называемые переменными,
  34. помечаются знаком двоеточия в начале имени переменной:
  35. <code>:username</code>.
  36. </para>
  37. <note>
  38. <title>Использование символов</title>
  39. <para>
  40. Текущая реализация позволяет использовать любые (за исключением
  41. косой черты) символы в идентификаторе переменной,
  42. но сильно рекомендуется использовать в них только символы,
  43. допустимые для переменных в php. Есть вероятность, что в
  44. будущем реализация изменится, и это может вызвать скрытые ошибки в
  45. вашем коде.
  46. </para>
  47. </note>
  48. <para>
  49. Этот маршрут должен сработать, когда вы вводите
  50. <code>http://domain.com/author/martel</code> в своем броузере, в этом
  51. случае все его переменные будут добавлены в объект
  52. <code>Zend_Controller_Request</code> и будут доступны в вашем
  53. контроллере <code>ProfileController</code>.
  54. Переменные, возвращаемые в этом примере, могут быть представленые в виде
  55. следующего массива пар ключ/значение:
  56. </para>
  57. <programlisting role="php"><![CDATA[
  58. $values = array(
  59. 'username' => 'martel',
  60. 'controller' => 'profile',
  61. 'action' => 'userinfo'
  62. );
  63. ]]>
  64. </programlisting>
  65. <para>
  66. Затем <code>Zend_Controller_Dispatcher_Standard</code> должен вызвать
  67. метод <code>userinfoAction()</code> вашего класса
  68. <code>ProfileController</code> (используется модуль по умолчанию),
  69. основываясь на этих значениях. Вы сможете получать эти переменные через
  70. методы <code>Zend_Controller_Action::_getParam()</code> или
  71. <code>Zend_Controller_Request::getParam()</code>.
  72. </para>
  73. <programlisting role="php"><![CDATA[
  74. public function userinfoAction()
  75. {
  76. $request = $this->getRequest();
  77. $username = $request->getParam('username');
  78. $username = $this->_getParam('username');
  79. }
  80. ]]>
  81. </programlisting>
  82. <para>
  83. Определение маршрута может содержать в себе еще один специальный символ
  84. (метасимвол), представленный символом '*'. Он используется для сбора
  85. параметров, как в маршруте Module, используемом по умолчанию
  86. (пары переменная => значение, определенные в URI). Следующий маршрут
  87. приближенно воспроизводит поведение маршрута Module:
  88. </para>
  89. <programlisting role="php"><![CDATA[
  90. $route = new Zend_Controller_Router_Route(
  91. ':module/:controller/:action/*',
  92. array('module' => 'default')
  93. );
  94. $router->addRoute('default', $route);
  95. ]]>
  96. </programlisting>
  97. <sect4 id="zend.controller.router.routes.standard.variable-defaults">
  98. <title>Значения переменных по умолчанию</title>
  99. <para>
  100. Любая переменная в маршруте может иметь значение по умолчанию, для
  101. этого используется второй параметр конструктора
  102. <code>Zend_Controller_Router_Route</code>. Этот параметр является
  103. массивом с ключами, представляющими имена переменных, и со
  104. значениями в качестве значений переменных по умолчанию:
  105. </para>
  106. <programlisting role="php"><![CDATA[
  107. $route = new Zend_Controller_Router_Route(
  108. 'archive/:year',
  109. array('year' => 2006)
  110. );
  111. $router->addRoute('archive', $route);
  112. ]]>
  113. </programlisting>
  114. <para>
  115. Маршрут выше будет соответствовать URL-ам
  116. <code>http://domain.com/archive/2005</code> и
  117. <code>http://example.com/archive</code>. В последнем случае
  118. переменная year будет иметь начальное значение по умолчанию 2006.
  119. </para>
  120. <para>
  121. В этом примере переменная year будет добавлена в объект запроса.
  122. Поскольку не была предоставлена информация для маршрутизации (не
  123. определены параметры controller и action), то управление будет
  124. передано контроллеру и методу действия, используемым по умолчанию
  125. (оба определены в <code>Zend_Controller_Dispatcher_Abstract</code>).
  126. Для того, чтобы сделать этот пример более полезным, нужно
  127. передать действительные контроллер и действие в качестве значений по
  128. умолчанию:
  129. </para>
  130. <programlisting role="php"><![CDATA[
  131. $route = new Zend_Controller_Router_Route(
  132. 'archive/:year',
  133. array(
  134. 'year' => 2006,
  135. 'controller' => 'archive',
  136. 'action' => 'show'
  137. )
  138. );
  139. $router->addRoute('archive', $route);
  140. ]]>
  141. </programlisting>
  142. <para>
  143. В результате будет вызван метод <code>showAction()</code> класса
  144. <code>ArchiveController</code>.
  145. </para>
  146. </sect4>
  147. <sect4 id="zend.controller.router.routes.standard.variable-requirements">
  148. <title>Требования к переменным</title>
  149. <para>
  150. Можно передать конструктору
  151. <code>Zend_Controller_Router_Route</code> третий параметр, в котором
  152. установлены требования к переменным. Они определяются как части
  153. регулярных выражений:
  154. </para>
  155. <programlisting role="php"><![CDATA[
  156. $route = new Zend_Controller_Router_Route(
  157. 'archive/:year',
  158. array(
  159. 'year' => 2006,
  160. 'controller' => 'archive',
  161. 'action' => 'show'
  162. ),
  163. array('year' => '\d+')
  164. );
  165. $router->addRoute('archive', $route);
  166. ]]>
  167. </programlisting>
  168. <para>
  169. В случае маршрута, определенного таким образом, маршрутизатор будет
  170. считать URL соответствующим ему только если переменная year
  171. содержит числовые данные - например,
  172. <code>http://domain.com/archive/2345</code>. URL вида
  173. <code>http://example.com/archive/test</code> не будет
  174. соответствовать этому маршруту, вместо этого будет произведен
  175. переход к следующему маршруту в цепочке.
  176. </para>
  177. </sect4>
  178. </sect3>
  179. <!--
  180. vim:se ts=4 sw=4 et:
  181. -->