Zend_Controller-ActionController.xml 28 KB

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