Zend_Controller-ActionController.xml 32 KB

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