Zend_Controller-Dispatcher.xml 10 KB

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