Zend_Controller-Dispatcher.xml 11 KB

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