Zend_Controller-ActionController.xml 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 18556 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.controller.action">
  5. <title>Controladores de Acción</title>
  6. <sect2 id="zend.controller.action.introduction">
  7. <title>Introducción</title>
  8. <para>
  9. <classname>Zend_Controller_Action</classname> es una clase abstracta
  10. que puede utilizar para implementar controladores de acción
  11. (Action Controllers) para usar con el Front Controller al crear un
  12. un sitio basado en el patrón Modelo-Vista-Controlador (<acronym>MVC</acronym>).
  13. </para>
  14. <para>
  15. Para usar <classname>Zend_Controller_Action</classname>, necesitará
  16. hacerla una subclase en sus clases actuales de controladores de
  17. acción (o hacerla una subclase para crear su propia clase base de
  18. acción de controladores).
  19. La operación más elemental es hacerla una subclase, y crear métodos
  20. de acción que corresponden a las diversas acciones que desee que el
  21. contralor maneje para su sitio.
  22. El manejo del ruteo y envío de
  23. <classname>Zend_Controller</classname> descubrirá por sí mismo
  24. cualquier método que termine en 'Action' en su clase, como posibles
  25. acciones del controlador.
  26. </para>
  27. <para>
  28. Por ejemplo, digamos que su clase se define como sigue:
  29. </para>
  30. <programlisting language="php"><![CDATA[
  31. class FooController extends Zend_Controller_Action
  32. {
  33. public function barAction()
  34. {
  35. // hacer algo
  36. }
  37. public function bazAction()
  38. {
  39. // hacer algo
  40. }
  41. }
  42. ]]></programlisting>
  43. <para>
  44. La clase de arriba <emphasis>FooController</emphasis> (el controlador
  45. <emphasis>foo</emphasis>) define dos acciones, <emphasis>bar</emphasis> y
  46. <emphasis>baz</emphasis>.
  47. </para>
  48. <para>
  49. Se pueden lograr muchas cosas más, tales como personalizar
  50. la inicialización de acciones, las acciones a llamar por defecto no
  51. deberían especificar ninguna acción (o una acción inválida),
  52. ganchos de pre y post despacho, y una variedad de métodos ayudantes.
  53. Este capítulo sirve como panorama de la funcionalidad del
  54. controlador de acciones.
  55. </para>
  56. <note>
  57. <title>Comportamiento por Defecto</title>
  58. <para>
  59. Por defecto, el <link linkend="zend.controller.front">front
  60. controller</link> habilita al ayudante de acción <link
  61. linkend="zend.controller.actionhelpers.viewrenderer">ViewRenderer</link>.
  62. Este ayudante toma a su cargo la inyección del objeto "view"
  63. en el contralor, así como compatibilizar automáticamente las
  64. vistas. Usted podrá desactivarlo dentro de su contralor de
  65. acción por uno de los métodos siguientes:
  66. </para>
  67. <programlisting language="php"><![CDATA[
  68. class FooController extends Zend_Controller_Action
  69. {
  70. public function init()
  71. {
  72. // Local a este controlador únicamente; afecta a todas las acciones
  73. // al cargarse en init:
  74. $this->_helper->viewRenderer->setNoRender(true);
  75. // Globalmente:
  76. $this->_helper->removeHelper('viewRenderer');
  77. // También globalmente, pero tendría que ser en conjunción con la
  78. // versión local con el fin de propagarlo para este controlador:
  79. Zend_Controller_Front::getInstance()
  80. ->setParam('noViewRenderer', true);
  81. }
  82. }
  83. ]]></programlisting>
  84. <para>
  85. <methodname>initView()</methodname>, <methodname>getViewScript()</methodname>,
  86. <methodname>render()</methodname>, y <methodname>renderScript()</methodname> cada
  87. proxy al <emphasis>ViewRenderer</emphasis> a menos que el ayudante no
  88. esté como ayudante intermediario o no se haya establecido el
  89. flag de <emphasis>noViewRenderer</emphasis>.
  90. </para>
  91. <para>
  92. También puede simplemente desactivarse para una prestación
  93. individual ajustando el flag <emphasis>noRender</emphasis> de
  94. <emphasis>ViewRenderer</emphasis>:
  95. </para>
  96. <programlisting language="php"><![CDATA[
  97. class FooController extends Zend_Controller_Action
  98. {
  99. public function barAction()
  100. {
  101. // deshabilitar el autorendering para esta acción solamente:
  102. $this->_helper->viewRenderer->setNoRender();
  103. }
  104. }
  105. ]]></programlisting>
  106. <para>
  107. Las principales razones para desactivar
  108. <emphasis>ViewRenderer</emphasis> son si usted simplemente no necesita
  109. una objeto "view" o si no está mostrándolos via view scripts
  110. (por ejemplo, cuando se utiliza un controlador de acción
  111. para alimentar a los protocolos de un servicio web como <acronym>SOAP</acronym>,
  112. <acronym>XML-RPC</acronym>, o <acronym>REST</acronym>). En muchos casos, nunca necesitará desactivar
  113. a <emphasis>ViewRenderer</emphasis> globalmente, sólo selectivamente
  114. dentro de los distintos controladores o acciones.
  115. </para>
  116. </note>
  117. </sect2>
  118. <sect2 id="zend.controller.action.initialization">
  119. <title>Inicialización de Objectos</title>
  120. <para>
  121. Si bien siempre puede anular el contolador de acción del
  122. constructor, no lo recomendamos.
  123. <classname>Zend_Controller_Action::__construct()</classname>
  124. realiza algunas tareas importantes, tales como registrar los
  125. objetos de solicitud y respuesta, así como los argumentos de
  126. cualquier invocación personalizada pasados desde el front
  127. controller. Si debe anular el constructor, asegúrese de llamar a
  128. <methodname>parent::__construct($request, $response, $invokeArgs)</methodname>.
  129. </para>
  130. <para>
  131. La manera más apropiada de personalizar la instanciación es
  132. utilizar el método <methodname>init()</methodname>, el cual es llamado como la
  133. última tarea de <methodname>__construct()</methodname>.
  134. Por ejemplo, si se quiere conectar a una base de datos en la
  135. instanciación:
  136. </para>
  137. <programlisting language="php"><![CDATA[
  138. class FooController extends Zend_Controller_Action
  139. {
  140. public function init()
  141. {
  142. $this->db = Zend_Db::factory('Pdo_Mysql', array(
  143. 'host' => 'myhost',
  144. 'username' => 'user',
  145. 'password' => 'XXXXXXX',
  146. 'dbname' => 'website'
  147. ));
  148. }
  149. }
  150. ]]></programlisting>
  151. </sect2>
  152. <sect2 id="zend.controller.action.prepostdispatch">
  153. <title>Ganchos de Pre- and Post-Despacho</title>
  154. <para>
  155. <classname>Zend_Controller_Action</classname> especifica dos
  156. métodos que pueden ser llamados para marcar una solicitud de acción,
  157. <methodname>preDispatch()</methodname> y <methodname>postDispatch()</methodname>.
  158. Estas pueden ser útiles de varias maneras: verificar la
  159. autenticación y <acronym>ACL</acronym>s antes de ejecutar una acción (llamando a
  160. <methodname>_forward()</methodname> en <methodname>preDispatch()</methodname>, se saltará
  161. la acción), por ejemplo, o colocando contenido generado en una
  162. plantilla general del sitio (<methodname>postDispatch()</methodname>).
  163. </para>
  164. <note>
  165. <title>Usage of init() vs. preDispatch()</title>
  166. <para>
  167. In the <link linkend="zend.controller.action.initialization">previous
  168. section</link>, we introduced the <methodname>init()</methodname> method, and
  169. in this section, the <methodname>preDispatch()</methodname> method. What is the
  170. difference between them, and what actions would you take in each?
  171. </para>
  172. <para>
  173. The <methodname>init()</methodname> method is primarily intended for extending the
  174. constructor. Typically, your constructor should simply set object state, and not
  175. perform much logic. This might include initializing resources used in the controller
  176. (such as models, configuration objects, etc.), or assigning values retrieved from
  177. the front controller, bootstrap, or a registry.
  178. </para>
  179. <para>
  180. The <methodname>preDispatch()</methodname> method can also be used to set object
  181. or environmental (e.g., view, action helper, etc.) state, but its primary purpose
  182. is to make decisions about whether or not the requested action should be dispatched.
  183. If not, you should then <methodname>_forward()</methodname> to another action, or
  184. throw an exception.
  185. </para>
  186. <para>
  187. Note: <methodname>_forward()</methodname> actually will not work correctly when
  188. executed from <methodname>init()</methodname>, which is a formalization of the
  189. intentions of the two methods.
  190. </para>
  191. </note>
  192. </sect2>
  193. <sect2 id="zend.controller.action.accessors">
  194. <title>Accessors (Accededores)</title>
  195. <para>
  196. Con el objeto, se registran una serie de objetos y variables,
  197. y cada uno tiene métodos de acceso.
  198. </para>
  199. <itemizedlist>
  200. <listitem><para>
  201. <emphasis>Objecto Requerimiento</emphasis>: <methodname>getRequest()</methodname>
  202. puede ser utilizado para recuperar el objeto solicitud
  203. utilizado para llamar a la acción.
  204. </para></listitem>
  205. <listitem>
  206. <para>
  207. <emphasis>Objecto Respuesta</emphasis>:
  208. <methodname>getResponse()</methodname> puede ser utilizado para
  209. recuperar el objeto respuesta agregando la respuesta final.
  210. Algunas llamadas típicas podrían ser:
  211. </para>
  212. <programlisting language="php"><![CDATA[
  213. $this->getResponse()->setHeader('Content-Type', 'text/xml');
  214. $this->getResponse()->appendBody($content);
  215. ]]></programlisting>
  216. </listitem>
  217. <listitem>
  218. <para>
  219. <emphasis>Argumentos de Invocación</emphasis>: el front
  220. controller puede empujar parámetros al router, al
  221. despachador, y al controlador de acción. Para recuperarlos,
  222. use <methodname>getInvokeArg($key)</methodname>; por otra parte, se
  223. puede traer toda la lista utilizando
  224. <methodname>getInvokeArgs()</methodname>.
  225. </para>
  226. </listitem>
  227. <listitem>
  228. <para>
  229. <emphasis>Parámetros de Requerimientos</emphasis>:
  230. La objeto solicitud agrega parámetros de solicitud,
  231. como cualquiera de los parámetros <constant>_GET</constant> o <constant>_POST</constant>,
  232. o parámetros del usuario especificados en la información
  233. del path de la <acronym>URL</acronym>. Para recuperarlos, use
  234. <methodname>_getParam($key)</methodname> o <methodname>_getAllParams()</methodname>.
  235. También se pueden establecer parámetros de solicitud usando
  236. <methodname>_setParam()</methodname>; lo que es útil cuando se reenvían
  237. a acciones adicionales.
  238. </para>
  239. <para>
  240. Para probar si un parámetro existe o no (muy útil para
  241. bifurcaciones lógicas), use <methodname>_hasParam($key)</methodname>.
  242. </para>
  243. <note>
  244. <para>
  245. <methodname>_getParam()</methodname> puede tomar opcionalmente un
  246. segundo argumento que contiene un valor por defecto a
  247. utilizar si el parámetro no está establecido o está
  248. vacío. Usándolo elimina la necesidad de llamar
  249. previamente a <methodname>_hasParam()</methodname> para
  250. recuperar un valor:
  251. </para>
  252. <programlisting language="php"><![CDATA[
  253. // Usar por defecto el valor 1 si el id no está establecido
  254. $id = $this->_getParam('id', 1);
  255. // En lugar de:
  256. if ($this->_hasParam('id') {
  257. $id = $this->_getParam('id');
  258. } else {
  259. $id = 1;
  260. }
  261. ]]></programlisting>
  262. </note>
  263. </listitem>
  264. </itemizedlist>
  265. </sect2>
  266. <sect2 id="zend.controller.action.viewintegration">
  267. <title>Integración de Vistas</title>
  268. <note id="zend.controller.action.viewintegration.viewrenderer">
  269. <title>Integración de la Vista por Defecto via ViewRenderer</title>
  270. <para>
  271. El contenido de esta sección sólo es válida cuando usted tiene
  272. explícitamente deshabilitado a
  273. <link linkend="zend.controller.actionhelpers.viewrenderer">ViewRenderer</link>.
  274. De lo contrario, puede saltarse esta sección.
  275. </para>
  276. </note>
  277. <para>
  278. <classname>Zend_Controller_Action</classname> proporciona un
  279. mecanismo rudimentario y flexible para ver la integración.
  280. Hay dos métodos para lograrlo, <methodname>initView()</methodname> y
  281. <methodname>render()</methodname>; el anterior método <varname>$view</varname>
  282. carga la propiedad pública, y este último muestra una vista en
  283. base a la acción requerida actual, utilizando la jerarquía del
  284. directorio para determinar el path del script.
  285. </para>
  286. <sect3 id="zend.controller.action.viewintegration.initview">
  287. <title>Inicialización de la Vista</title>
  288. <para>
  289. <methodname>initView()</methodname> inicializa el objeto vista.
  290. <methodname>render()</methodname> llama a <methodname>initView()</methodname>
  291. con el fin de recuperar el objeto vista, pero puede ser
  292. iniciada en cualquier momento; por defecto introduce
  293. información a la propiedad de <varname>$view</varname> con un objeto
  294. <classname>Zend_View</classname>, pero se puede usar cualquier
  295. clase que implemente <classname>Zend_View_Interface</classname>.
  296. Si <varname>$view</varname> ya ha sido inicializada, simplemente
  297. devuelve esa propiedad.
  298. </para>
  299. <para>
  300. La implementación por defecto hace la siguiente hipótesis de la
  301. estructura del directorio:
  302. </para>
  303. <programlisting language="php"><![CDATA[
  304. applicationOrModule/
  305. controllers/
  306. IndexController.php
  307. views/
  308. scripts/
  309. index/
  310. index.phtml
  311. helpers/
  312. filters/
  313. ]]></programlisting>
  314. <para>
  315. En otras palabras, los scripts de vista se supone están en el
  316. subdirectorio <filename>/views/scripts/</filename>, y en el subdirectorio
  317. <filename>/views/</filename> se supone que contiene funcionalidades
  318. hermanas (ayudantes, filtros). Al determinar el nombre y el
  319. path del script, el directorio <filename>views/scripts/</filename>
  320. será utilizado como el path base, con directorios nombrados
  321. después que los controladores individuales proporcionen una
  322. jerarquía a los scripts de vista.
  323. </para>
  324. </sect3>
  325. <sect3 id="zend.controller.action.viewintegration.render">
  326. <title>Suministrando las Vistas</title>
  327. <para>
  328. <methodname>render()</methodname> tiene la siguiente firma:
  329. </para>
  330. <programlisting language="php"><![CDATA[
  331. string render(string $action = null,
  332. string $name = null,
  333. bool $noController = false);
  334. ]]></programlisting>
  335. <para>
  336. <methodname>render()</methodname> suministra un script de vista.
  337. Si no se pasan argumentos, se supone que el script requerido es
  338. <filename>[controller]/[action].phtml</filename> (donde
  339. <filename>.phtml</filename> es el valor de la propiedad
  340. <filename>$viewSuffix</filename>).
  341. Pasándole un valor a <methodname>$action</methodname> suministrará esa
  342. plantilla en al subdirectorio <filename>/[controller]/</filename>. Para
  343. anular el subdirectorio <filename>/[controller]/</filename> ponga un
  344. valor <constant>TRUE</constant> en <varname>$noController</varname>.
  345. Por último, las plantillas son suministradas en el objeto
  346. respuesta; si desea suministrar a un determinado
  347. <link linkend="zend.controller.response.namedsegments">
  348. named segment</link> en el objeto respuesta, pase un valor a
  349. <varname>$name</varname>.
  350. </para>
  351. <note><para>
  352. Dado que el controlador y los nombres de acción pueden
  353. contener caracteres delimitadores como '_', '.', y '-',
  354. <methodname>render()</methodname> los normaliza a '-' para determinar
  355. el nombre del script. Internamente, utiliza los
  356. delimitadores de palabra y de path del despachador para
  357. hacer esta normalización. Así, una solicitud a
  358. <filename>/foo.bar/baz-bat</filename> suministrará el script
  359. <filename>foo-bar/baz-bat.phtml</filename>.
  360. Si su método de acción contiene camelCasing, recuerde que
  361. esto se traducirá en palabras separadas por '-'
  362. al determinar el nombre del archivo del script de vista.
  363. </para></note>
  364. <para>
  365. Algunos ejemplos:
  366. </para>
  367. <programlisting language="php"><![CDATA[
  368. class MyController extends Zend_Controller_Action
  369. {
  370. public function fooAction()
  371. {
  372. // Suministra my/foo.phtml
  373. $this->render();
  374. // Suministra my/bar.phtml
  375. $this->render('bar');
  376. // Suministra baz.phtml
  377. $this->render('baz', null, true);
  378. // Suministra my/login.phtml al segmento 'form' del
  379. // objeto respuesta
  380. $this->render('login', 'form');
  381. // Suministra site.phtml al segmento 'page' del objeto
  382. // respuesta; no usa el subdirectorio 'my/'
  383. $this->render('site', 'page', true);
  384. }
  385. public function bazBatAction()
  386. {
  387. // Suministra my/baz-bat.phtml
  388. $this->render();
  389. }
  390. }
  391. ]]></programlisting>
  392. </sect3>
  393. </sect2>
  394. <sect2 id="zend.controller.action.utilmethods">
  395. <title>Métodos Utilitarios</title>
  396. <para>
  397. Además de los accesadores y de los métodos de integración de vistas,
  398. <classname>Zend_Controller_Action</classname> tiene varios
  399. métodos utilitarios para realizar tareas comunes dentro de sus
  400. métodos de acción (o de pre- y post-dispatch).
  401. </para>
  402. <itemizedlist>
  403. <listitem>
  404. <para>
  405. <methodname>_forward($action, $controller = null, $module = null,
  406. array $params = null)</methodname>: realiza otra acción. Si es
  407. llamado en <methodname>preDispatch()</methodname>, la acción actualmente
  408. requerida se saltará en favor de la nueva.
  409. De lo contrario, después de procesar la acción actual,
  410. se ejecutará la acción solicitada en _forward().
  411. </para>
  412. </listitem>
  413. <listitem>
  414. <para>
  415. <methodname>_redirect($url, array $options =
  416. array())</methodname>: redireccionar a otro lugar.
  417. Este método toma una <acronym>URL</acronym> y un conjunto de opciones.
  418. Por defecto, realiza una redirección <acronym>HTTP</acronym> 302.
  419. </para>
  420. <para>
  421. Las opciones pueden incluir uno o más de los siguientes:
  422. </para>
  423. <itemizedlist>
  424. <listitem>
  425. <para>
  426. <emphasis>exit:</emphasis> ya sea para salir
  427. inmediatamente o no. Si así lo solicita, limpiamente
  428. cerrará cualquier sesión abierta y realizará
  429. la redirección.
  430. </para>
  431. <para>
  432. Puede configurar esta opción globalmente en el
  433. controlador utilizando el accesador
  434. <methodname>setRedirectExit()</methodname>.
  435. </para>
  436. </listitem>
  437. <listitem>
  438. <para>
  439. <emphasis>prependBase:</emphasis> ya sea
  440. anteponiendo o no la base <acronym>URL</acronym> registrada con el
  441. objeto solicitud a la <acronym>URL</acronym> provista.
  442. </para>
  443. <para>
  444. Puede configurar esta opción globalmente en el
  445. controlador utilizando el accesador
  446. <methodname>setRedirectPrependBase()</methodname>.
  447. </para>
  448. </listitem>
  449. <listitem>
  450. <para>
  451. <emphasis>code:</emphasis> qué código <acronym>HTTP</acronym>
  452. utilizar en la redirección. Por defecto,
  453. se utiliza un <acronym>HTTP</acronym> 302; se puede utilizar cualquier
  454. código entre 301 y 306.
  455. </para>
  456. <para>
  457. Puede configurar esta opción globalmente en el
  458. controlador utilizando el accesador
  459. <methodname>setRedirectCode()</methodname>.
  460. </para>
  461. </listitem>
  462. </itemizedlist>
  463. </listitem>
  464. </itemizedlist>
  465. </sect2>
  466. <sect2 id="zend.controller.action.subclassing">
  467. <title>Controladores de Acción y haciendo Subclases</title>
  468. <para>
  469. Por diseño, <classname>Zend_Controller_Action</classname>
  470. debe ser "subclaseada" a fin de crear un controlador de acción.
  471. Como mínimo, necesitará definir los métodos de acción que podrá
  472. llamar el controlador.
  473. </para>
  474. <para>
  475. Además de crear una funcionalidad útil para su aplicaciones web,
  476. también puede encontrar que está repitiendo demasiado los mismos
  477. setups o métodos utilitarios en sus diferentes controladores;
  478. si así fuera, creando una clase base común del controlador
  479. que extienda <classname>Zend_Controller_Action</classname> puede
  480. resolver esta redundacia.
  481. </para>
  482. <example id="zend.controller.action.subclassing.example-call">
  483. <title>Manejando Acciones No Existentes</title>
  484. <para>
  485. Si hay una solicitud a un controlador que incluye un método de
  486. acción no definido, se invocará a
  487. <classname>Zend_Controller_Action::__call()</classname>.
  488. <methodname>__call()</methodname> es, por supuesto, el método mágico de <acronym>PHP</acronym>
  489. para la sobrecarga del método.
  490. </para>
  491. <para>
  492. Por defecto, este método lanza un
  493. <classname>Zend_Controller_Action_Exception</classname>
  494. indicando que el método no se encuentró en el controlador.
  495. Si el método requerido termina en 'Action', la suposición es
  496. que una acción fue solicitada y no existe; tales errores
  497. resultan en una excepción con un código 404.
  498. Todos los demás métodos resultan en una excepción con un
  499. código 500. Esto le permite diferenciar fácilmente entre una
  500. página no encontrada y errores de aplicación con su
  501. manejador de errores.
  502. </para>
  503. <para>
  504. Usted debe anular esta funcionalidad si desea realizar otras
  505. operaciones. Por ejemplo, si desea mostrar un mensaje de error,
  506. usted podría escribir algo como esto:
  507. </para>
  508. <programlisting language="php"><![CDATA[
  509. class MyController extends Zend_Controller_Action
  510. {
  511. public function __call($method, $args)
  512. {
  513. if ('Action' == substr($method, -6)) {
  514. // Si no se encontró el método de la acción, suministrar la
  515. // plantilla de error
  516. return $this->render('error');
  517. }
  518. // todos los otros métodos lanzan una excepción
  519. throw new Exception('Se ha llamado al método "'
  520. . $method
  521. . '" que es inválido',
  522. 500);
  523. }
  524. }
  525. ]]></programlisting>
  526. <para>
  527. Otra posibilidad es que puede querer avanzar a un controlador
  528. de página por defecto:
  529. </para>
  530. <programlisting language="php"><![CDATA[
  531. class MyController extends Zend_Controller_Action
  532. {
  533. public function indexAction()
  534. {
  535. $this->render();
  536. }
  537. public function __call($method, $args)
  538. {
  539. if ('Action' == substr($method, -6)) {
  540. // Si no se encontró el método de acción, avance a la
  541. // acción index
  542. return $this->_forward('index');
  543. }
  544. // todos los otros métodos lanzan una excepción
  545. throw new Exception('Se ha llamado al método "'
  546. . $method
  547. . '" que es inválido',
  548. 500);
  549. }
  550. }
  551. ]]></programlisting>
  552. </example>
  553. <para>
  554. Además de sobrecargar <methodname>__call()</methodname>, cada uno de los
  555. métodos gancho de inicialización, utilidad, accesador, vista,
  556. y despacho mencionados anteriormente en este capítulo pueden ser
  557. anulados a fin de personalizar sus controladores.
  558. Como ejemplo, si está almacenando su objeto vista en un registro,
  559. quizás desee modificar su método <methodname>initView()</methodname> con código
  560. parecido al siguiente:
  561. </para>
  562. <programlisting language="php"><![CDATA[
  563. abstract class My_Base_Controller extends Zend_Controller_Action
  564. {
  565. public function initView()
  566. {
  567. if (null === $this->view) {
  568. if (Zend_Registry::isRegistered('view')) {
  569. $this->view = Zend_Registry::get('view');
  570. } else {
  571. $this->view = new Zend_View();
  572. $this->view->setBasePath(dirname(__FILE__) . '/../views');
  573. }
  574. }
  575. return $this->view;
  576. }
  577. }
  578. ]]></programlisting>
  579. <para>
  580. Es de esperar, que de la información en este capítulo, usted puede ver
  581. la flexibilidad de este componente en particular y cómo puede darle
  582. forma a su aplicaciones o a las necesidades de su sitio web.
  583. </para>
  584. </sect2>
  585. </sect1>
  586. <!--
  587. vim:se ts=4 sw=4 et:
  588. -->