2
0

Zend_Controller-Dispatcher.xml 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- Reviewed: no -->
  3. <sect1 id="zend.controller.dispatcher">
  4. <title>El Despachador</title>
  5. <sect2 id="zend.controller.dispatcher.overview">
  6. <title>Introducción</title>
  7. <para>
  8. Despachar es el proceso de tomar el objeto solicitud,
  9. <classname>Zend_Controller_Request_Abstract</classname>,
  10. extraer el nombre del módulo, el nombre del controlador, el nombre
  11. de la acción, y los parámetros opcionales contenido en él, y luego
  12. instanciar un controlador y llamar una acción de ese controlador.
  13. Si no se encuentra algún módulo, controlador o acción, se usarán
  14. los valores por defecto para ellos.
  15. <classname>Zend_Controller_Dispatcher_Standard</classname>
  16. especifica <code>index</code> para cada uno de los controladores y
  17. acciones por defecto y <code>default</code> para el valor por
  18. defecto del módulo, pero permite al desarrollador cambiar los
  19. valores por defecto para cada uno usando los métodos
  20. <code>setDefaultController()</code>,
  21. <code>setDefaultAction()</code>, y <code>setDefaultModule()</code>
  22. respectivamente.
  23. </para>
  24. <note>
  25. <title>Módulo por Defecto</title>
  26. <para>
  27. Cuando se crean aplicaciones modulares, puede encontrarse
  28. queriendo también el namespace por defecto del módulo (la
  29. configuración por defecto es que el módulo por defecto es
  30. <emphasis>no</emphasis> namespaced).
  31. Como de 1.5.0, ahora puede hacerlo especificando el
  32. <code>prefixDefaultModule</code> como verdadero tanto en el
  33. front controller como es su despachador:
  34. </para>
  35. <programlisting role="php"><![CDATA[
  36. // En su front controller:
  37. $front->setParam('prefixDefaultModule', true);
  38. // En su despachador:
  39. $dispatcher->setParam('prefixDefaultModule', true);
  40. ]]></programlisting>
  41. <para>
  42. Esto le permite re-determinar un módulo existente para ser el
  43. módulo por defecto para una solicitud.
  44. </para>
  45. </note>
  46. <para>
  47. El proceso de despachar tiene lugar en un bucle en el front controller.
  48. Antes de llevarse a cabo el despacho, el front controller rutea la
  49. solicitud para encontrar valores especificados por el usuario para
  50. el módulo, controlador, acción, y los parámetros opcionales.
  51. A continuación entra en un loop de despacho, despachando la
  52. solicitud.
  53. </para>
  54. <para>
  55. Al comienzo de cada iteración, establece un flag en el objeto
  56. solicitud indicando que la acción se ha despachado.
  57. Si una acción o un plugin pre/postDispatch resetea ese flag,
  58. el loop de despacho continuará e intentará despachar la nueva
  59. solicitud. Cambiando el controlador y/o la acción en la solicitud y
  60. reseteando el flag despachado, el desarrollador puede definir
  61. una cadena de peticiones a realizar.
  62. </para>
  63. <para>
  64. El método del controlador de acción que controla ese despacho es
  65. <code>_forward()</code>; llamar a este método para cualquiera de los
  66. pre/postDispatch() o métodos de acción, proporcionando un
  67. controlador de acciónes, módulo y, opcionalmente cualquier parámetro
  68. adicional que desee enviar a la nueva acción:
  69. </para>
  70. <programlisting role="php"><![CDATA[
  71. public function fooAction()
  72. {
  73. // adelantar a otra acción en el controlador y módulo actuales:
  74. $this->_forward('bar', null, null, array('baz' => 'bogus'));
  75. }
  76. public function barAction()
  77. {
  78. // adelantar a una acción en otro controlador:
  79. // FooController::bazAction(),
  80. // en el módulo actual:
  81. $this->_forward('baz', 'foo', null, array('baz' => 'bogus'));
  82. }
  83. public function bazAction()
  84. {
  85. // adelantar a una acción en otro controlador en otro módulo,
  86. // Foo_BarController::bazAction():
  87. $this->_forward('baz', 'bar', 'foo', array('baz' => 'bogus'));
  88. }
  89. ]]></programlisting>
  90. </sect2>
  91. <sect2 id="zend.controller.dispatcher.subclassing">
  92. <title>Subclaseando el Despachador</title>
  93. <para>
  94. <classname>Zend_Controller_Front</classname> llamará en primer lugar
  95. al router para determinar la primera acción en la solicitud.
  96. A continuación se entra en un loop de despacho, el cual llama al
  97. despachador para despachar la acción.
  98. </para>
  99. <para>
  100. El despachador necesita de una variedad de datos a fin de hacer su
  101. trabajo - necesita saber cómo formatear los nombres del controlador
  102. y de la acción, dónde mirar para los archivos de clase del
  103. controlador, cuándo el nombre de un controlador provisto es válido
  104. o no, y una API para determinar si una determinada solicitud es
  105. incluso despachable basado en la otra información disponible.
  106. </para>
  107. <para>
  108. <classname>Zend_Controller_Dispatcher_Interface</classname>
  109. define los siguientes métodos como necesarios para cualquier
  110. implementación de un despachador:
  111. </para>
  112. <programlisting role="php"><![CDATA[
  113. interface Zend_Controller_Dispatcher_Interface
  114. {
  115. /**
  116. * Formatea un string dentro del nombre de clase del controlador.
  117. *
  118. * @param string $unformatted
  119. * @return string
  120. */
  121. public function formatControllerName($unformatted);
  122. /**
  123. * Formatea un string dentro de un nombre de método de acción.
  124. *
  125. * @param string $unformatted
  126. * @return string
  127. */
  128. public function formatActionName($unformatted);
  129. /**
  130. * Determina si la solicitud es despachable
  131. *
  132. * @param Zend_Controller_Request_Abstract $request
  133. * @return boolean
  134. */
  135. public function isDispatchable(
  136. Zend_Controller_Request_Abstract $request
  137. );
  138. /**
  139. * Establece un parámetro de usuario (via front controller, o para uso local)
  140. *
  141. * @param string $name
  142. * @param mixed $value
  143. * @return Zend_Controller_Dispatcher_Interface
  144. */
  145. public function setParam($name, $value);
  146. /**
  147. * Establece un array de parámetros de usuario
  148. *
  149. * @param array $params
  150. * @return Zend_Controller_Dispatcher_Interface
  151. */
  152. public function setParams(array $params);
  153. /**
  154. * Recupera un único parámetro de usuario
  155. *
  156. * @param string $name
  157. * @return mixed
  158. */
  159. public function getParam($name);
  160. /**
  161. * Recupera todos los parámetros de usuario
  162. *
  163. * @return array
  164. */
  165. public function getParams();
  166. /**
  167. * Limpia el stack de parámetros de usuario, o un único parámetro de usuario
  168. *
  169. * @param null|string|array single key or array of keys for
  170. * params to clear
  171. * @return Zend_Controller_Dispatcher_Interface
  172. */
  173. public function clearParams($name = null);
  174. /**
  175. * Establece el objeto respuesta a usar, si hubiera alguno
  176. *
  177. * @param Zend_Controller_Response_Abstract|null $response
  178. * @return void
  179. */
  180. public function setResponse(
  181. Zend_Controller_Response_Abstract $response = null
  182. );
  183. /**
  184. * Recupera el objeto respuesta, si hubiera alguno
  185. *
  186. * @return Zend_Controller_Response_Abstract|null
  187. */
  188. public function getResponse();
  189. /**
  190. * Agrega un directorio de controladoes al stack de directorios de controladores
  191. *
  192. * @param string $path
  193. * @param string $args
  194. * @return Zend_Controller_Dispatcher_Interface
  195. */
  196. public function addControllerDirectory($path, $args = null);
  197. /**
  198. * Establece el directorio (o directorios) donde se almacenan los archivos
  199. * de controladoes
  200. *
  201. * @param string|array $dir
  202. * @return Zend_Controller_Dispatcher_Interface
  203. */
  204. public function setControllerDirectory($path);
  205. /**
  206. * Regresa el directorio(s) actualmente establecido para el lookup de los
  207. * archivos de controladores
  208. *
  209. * @return array
  210. */
  211. public function getControllerDirectory();
  212. /**
  213. * Despacha una solicitud a una acción de (módulo/)controlador.
  214. *
  215. * @param Zend_Controller_Request_Abstract $request
  216. * @param Zend_Controller_Response_Abstract $response
  217. * @return Zend_Controller_Request_Abstract|boolean
  218. */
  219. public function dispatch(
  220. Zend_Controller_Request_Abstract $request,
  221. Zend_Controller_Response_Abstract $response
  222. );
  223. /**
  224. * Si un módulo dado es válido o no
  225. *
  226. * @param string $module
  227. * @return boolean
  228. */
  229. public function isValidModule($module);
  230. /**
  231. * Recuperar el nombre por defecto del módulo
  232. *
  233. * @return string
  234. */
  235. public function getDefaultModule();
  236. /**
  237. * Recuperar el nombre por defecto del controlador
  238. *
  239. * @return string
  240. */
  241. public function getDefaultControllerName();
  242. /**
  243. * Recuperar la acción por defecto
  244. *
  245. * @return string
  246. */
  247. public function getDefaultAction();
  248. }
  249. ]]></programlisting>
  250. <para>
  251. En muchos casos, sin embargo, simplemente debe extender la clase
  252. abstracta <classname>Zend_Controller_Dispatcher_Abstract</classname>,
  253. en el que cada uno de estas ya han sido definidas, o
  254. <classname>Zend_Controller_Dispatcher_Standard</classname>
  255. para modificar la funcionalidad del despachador estándar.
  256. </para>
  257. <para>
  258. Las posibles razones para subclasear al despachador incluye un
  259. deseo de utilizar un esquema diferente para nombrar las clases o
  260. métodos en sus controladores de acción, o el deseo de utilizar otro
  261. paradigma de despacho como ser despachar los archivos de acción
  262. bajo directorios de controladores (en lugar de despacharlos a los
  263. métodos de clase).
  264. </para>
  265. </sect2>
  266. </sect1>
  267. <!--
  268. vim:se ts=4 sw=4 et:
  269. -->