1 <?xml version="1.0" encoding="UTF-8"?>
2 <!-- EN-Revision: 15103 -->
4 <sect1 id="zend.controller.migration">
5 <title>Migración de versiones anteriores</title>
11 <acronym>MVC</acronym>
12 ha cambiado en el tiempo. Si usted ha empezado a
13 usar una versión anterior de Zend Framework,
14 siga la guía de abajo para
15 migrar sus acripts para usar la arquitectura nueva.
18 <sect2 id="zend.controller.migration.fromoneseventooneeight">
19 <title>Migración de 1.7.x a 1.8.0 o nuevas versiones</title>
21 <sect3 id="zend.controller.migration.fromoneseventooneeight.router">
22 <title>Cambios en Standard Route </title>
25 Como los segmentos traducidos fueron presentados en la nueva
29 <methodname>@</methodname>
30 es ahora un carácter especial al principio de
31 un segmento del route. Para poder
32 utilizarlo en un segmento estático,
33 tiene que escaparlo usando un segundo caracater
34 <methodname>@</methodname>
35 como prefijo. La misma regla se aplica ahora para el
37 <methodname>:</methodname>
43 <sect2 id="zend.controller.migration.fromonesixtooneseven">
44 <title>Migración de 1.6.x a 1.7.0 o nuevas versiones</title>
46 <sect3 id="zend.controller.migration.fromonesixtooneseven.dispatcher">
47 <title>Cambios en la interfaz del Dispatcher</title>
50 Los usuarios llamaron nuestra atención el hecho de que
51 <classname> Zend_Controller_Action_Helper_ViewRenderer </classname>
53 utilizando un método Dispatcher de la clase abstracta que no está en
55 Dispatcher de la interfaz. Hemos añadido el siguiente método para
57 Dispatcher de costumbre seguirán trabajando con las
58 implementaciones enviadas:
64 <methodname>formatModuleName()</methodname>
65 : debe utilizarse para tomar un nuevo
66 nombre de controlador, tal como uno que debería estar basado dentro de una petición
67 objeto, y cambiarlo a un nombre de clase apropiado que la clase extendida
68 <classname>Zend_Controller_Action</classname>
76 <sect2 id="zend.controller.migration.fromoneohtoonesix">
77 <title>Migrando desde 1.5.x to 1.6.0 o versiones posteriores</title>
79 <sect3 id="zend.controller.migration.fromoneohtoonesix.dispatcher">
80 <title>Cambios en la interfaz del Dispatcher</title>
83 Los usuarios atrajeron nuestra atención con el hecho de que
84 <classname> Zend_Controller_Front </classname>
86 <classname> Zend_Controller_Router_Route_Module </classname>
88 utilizando métodos del despachador que no estaban en la interfaz del
89 despachador. Ahora hemos adicionado los siguientes tres métodos para
90 asegurar que los despachadores diseñados sigan trabajando con las
91 implementaciones enviadas:
97 <methodname>getDefaultModule()</methodname>
98 : debe retornar el nombre del
105 <methodname>getDefaultControllerName()</methodname>
107 nombre del controlador por defecto.
113 <methodname>getDefaultAction()</methodname>
115 nombre de la acción por defecto.
122 <sect2 id="zend.controller.migration.fromoneohtoonefive">
123 <title>Migranado desde 1.0.x a 1.5.0 o versiones posteriores</title>
126 Aunque la mayoría de la funcionalidad básica sigue siendo la misma, y todas las
127 funcionalidades documentadas siguen siendo la mismas, hay una en particular
129 <emphasis>undocumented</emphasis>
135 <acronym>URL</acronym>
136 s, la manera de escribir la documentada acción camelCased
137 es usar un separador de
138 palabra, que son "." o '-' por defecto,
139 pero pueden ser configurados en el despachador.
140 El despachador internamente
141 convierte en minúsculas el nombre de la acción, y usa estos
142 separadores de palabra para
143 volver a montar el método de la acción camelCasing. Sin
144 embargo, debido a que las
146 <acronym>PHP</acronym>
147 no son sensibles a mayúsculas y minúsculas, usted
148 <emphasis>podría</emphasis>
149 escribir las URLs usando camelCasing, y el despachador los devolvería
151 ubicación. Por ejemplo, 'camel-cased' se convertirá en
152 'camelCasedAction' por el
153 despachador, mientras que 'camelCased' se
154 convertiría en 'camelCasedAction'; sin embargo,
155 debido a la insensibilidad de
156 <acronym>PHP</acronym>
157 , ambos ejecutarán el mismo método.
161 Esto causa problemas con la vista ViewRenderer cuando devuelve scripts de la
163 canónico, la documentada forma es que todos los separadores de palabra
165 guiones, y las palabras en minúsculas. Esto crea
166 un lazo semántico entre las acciones y
167 los scripts de las vistas, y la
168 normalización asegura que los scripts puedan ser
169 encontrados. Sin embargo, si la
170 acción "camelCased' es llamada y de hecho retornada, el
171 separador de la palabra
172 no está mas presente, y los ViewRenderer intenta devolver
174 ubicación diferente -- 'camelcased.phtml' en vez de
179 Algunos desarrolladores se basarón en esta "característica", que nunca fue la intención.
180 Varios cambios en el árbol 1.5.0 , sin embargo, hizo que la vista
182 resuelva estas direcciones, la semántica esta ahora
183 forzada. La primera de ellas, el
184 despachador ahora impone
185 la sensibilidad en los nombres de la acción. Lo que esto
186 significa es que la referencia a
188 <acronym>URL</acronym>
189 utilisando camelCasing ya no para devolver
190 al mismo método que utilizan los separadores
191 de palabras (es decir, 'camel-casing').
192 Esto nos lleva a la vista ViewRenderer ahora sólo
193 en honor a las acciones
194 palabra-separador cuando se devuleven los scripts vista.
198 Si usted nota que estaba dependiendo en esta "caracteristica", usted tiene muchas
205 Mejor opción: cambiar el nombre de sus scripts de la vistas. Pros:
206 compatibilidad hacia adelante. Contras: si usted tiene muchos scripts vista que
207 se basan en la primera vista, una conducta no deseada, tendrá
214 Segunda mejor opción: La vista ViewRenderer delega ahora resoluciones de scripts
216 <classname> Zend_Filter_Inflector </classname>
218 modificar las normas del inflector para que ya no separe
220 de una acción con un guión:
223 <programlisting language="php"><![CDATA[
225 Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
226 $inflector = $viewRenderer->getInflector();
227 $inflector->setFilterRule(':action', array(
228 new Zend_Filter_PregReplace(
229 '#[^a-z0-9' . preg_quote(DIRECTORY_SEPARATOR, '#') . ']+#i',
237 El anterior código modificará el inflector para que ya no
238 separe las palabras con
239 guión, usted puede querer eliminar
240 el filtro 'StringToLower' si usted desea
241 <emphasis>hacer</emphasis>
242 el nombre de script de vista actual camelCased también.
246 Si cambiar el nombre del script vista sería demasiado tedioso o tiempo
247 consumido, esta es su mejor opción hasta que pueda encontrar el
255 La opción menos deseable: Usted puede forzar al despachador para
257 nombres de acción camelCased con un nuevo controlador
259 'useCaseSensitiveActions':
262 <programlisting language="php"><![CDATA[
263 $front->setParam('useCaseSensitiveActions', true);
267 Esto le permitirá utilizar camelCasing sobre la url y siguir
269 la misma acción como cuando se utilizaba los separadores
270 de palabra. Sin embargo,
271 esto significa que los problemas originales
272 se iran terminando, lo más probable
274 segunda opción anterior, además de esto para que las cosas
276 confiablemente en todo.
280 Note, también, el uso de esta bandera aumentará un aviso de que
288 <sect2 id="zend.controller.migration.fromzeroninethree">
289 <title>Migrando desde 0.9.3 a 1.0.0RC1 o versiones posteriores</title>
292 Los cambios principales introducidos en 1.0.0RC1 son la introducción de
294 por defecto del plugin
295 <link linkend="zend.controller.plugins.standard.errorhandler">ErrorHandler</link>
297 <link linkend="zend.controller.actionhelpers.viewrenderer">ViewRenderer</link>
298 Por favor, lea la documentación de cada uno completamente para ver
300 efecto pueden tener en sus
306 <methodname>ErrorHandler</methodname>
308 <methodname>postDispatch ()</methodname>
309 para el control de excepciones, y enviarlo
310 a un especifico controlador de errores. Usted
312 controlador en su aplicación. Usted puede desactivarlo determinando el
313 parámetro del controlador
314 <methodname> noErrorHandler </methodname>
318 <programlisting language="php"><![CDATA[
319 $front->setParam('noErrorHandler', true);
324 <methodname>ViewRenderer</methodname>
325 automatiza inyección de vistas
326 en controladores de acción así como los autogeneradores de
328 basados en la acción actual. El principal problema que se puede
330 si se tiene acciones que no generan scripts de vista y tampoco llevan
333 <methodname>ViewRenderer</methodname>
335 un scrip de vista basado en el nombre de la acción.
339 Existen varias estrategias que se puede tomar para actualizar su código. En
341 plazo, se puede deshabilitar globalmente
342 <methodname> ViewRenderer </methodname>
343 en su controlador frontal bootstrap antes del
347 <programlisting language="php"><![CDATA[
348 // Asumiendo que $front es una instacia de Zend_Controller_Front
349 $front->setParam('noViewRenderer', true);
353 Sin embargo, esta no es una buena estrategia a largo plazo, eso significa que es
354 probable que usted escriba mas código.
358 Cuando se esta listo para empezar a usar la funcionalidad
359 <methodname>ViewRenderer</methodname>
360 , existen demasiadas cosas que ver en el
361 código del controlador. Primero, ver las
362 acciones método (los métodos
363 terminados en 'Action'), y determinar lo que cada uno esta
365 de los siguientes esta pasando, usted necesitará hacer cambios:
372 <methodname>$this->render()</methodname>
378 <methodname>$this->_forward()</methodname>
384 <methodname>$this->_redirect()</methodname>
390 <methodname>Redirector</methodname>
397 La forma mas fácil de cambiar es deshabilitar auto-rendering para ese método:
400 <programlisting language="php"><![CDATA[
401 $this->_helper->viewRenderer->setNoRender();
405 Si se encuentra que ninguno de sus acciones método se estan enviando,
407 redireccionando, lo más probable es que se quiera poner encima de la
409 <methodname> preDispatch () </methodname>
411 <methodname> de init() </methodname>
415 <programlisting language="php"><![CDATA[
416 public function preDispatch()
418 // disable view script autorendering
419 $this->_helper->viewRenderer->setNoRender()
420 // .. do other things...
425 Si se está llamando a
426 <methodname>render()</methodname>
428 <link linkend="zend.controller.modular"> la Convención Modular
429 de estructura de directorios</link>
430 , usted preferirá cambiar su código a
431 hacer uso del auto envio:
437 Si se esta enviando scripts de vistas multiples en una sóla
439 necesoita cambiar nada.
444 Si se está simplemente llamando
445 <methodname>render()</methodname>
447 argumento, se puede remover tales líneas.
452 Si se está llamando con argumentos, y
453 no se esta haciendo ningún proceso después
455 scrips de vistas multiples, se puede cambiar estas llamadas a leer
456 <methodname>$this->_helper->viewRenderer()</methodname>
463 Si no se esta usando la convención modular de estructura de directorios,
465 de métodos para definir la dirección de la vista base y
466 scripts de especificaciones de
467 dirección así se puede hacer uso de
468 <methodname>ViewRenderer</methodname>
469 . Pro favor leer la docuemntación de
470 <link linkend="zend.controller.actionhelpers.viewrenderer">ViewRenderer
472 para información de esos métodos.
476 Si se esta usando un objeto vista desde el registro o personalizando su
478 usando una diferente implementación de vista, se deseará
480 <methodname>ViewRenderer</methodname>
481 con este objeto. Esto puede ser
482 terminado facilmente en cualquier momento.
488 Antes de despachar una instancia del controlador frontal:
491 <programlisting language="php"><![CDATA[
492 // Asumiendo que $view ha sido definido
493 $viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer($view);
494 Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);
500 Cualquier momento el processo bootstrap:
503 <programlisting language="php"><![CDATA[
505 Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
506 $viewRenderer->setView($view);
512 Existen muchas vias para modificar
513 <methodname>ViewRenderer</methodname>
515 incluyendo la definición de diferentes scripts de vista a enviar, especificando
516 reemplazantes para todos los elementos reemplazables de la dirección del script vista
517 (incluyendo el sufijo), eligiendo una respuesta nombrada segmento para
519 no esta usando la convención modular de
520 estructura de directorios, se puede asociar
521 diferentes especificaciones
523 <methodname>ViewRenderer</methodname>
528 Le animamos a adaptar el código para utilizar el
529 <methodname>ErrorHandler</methodname>
531 <methodname>ViewRenderer</methodname>
533 ahora funcionalidad básica.
537 <sect2 id="zend.controller.migration.fromzeroninetwo">
538 <title>Migrando desde 0.9.2 to 0.9.3 o nuevas versiones</title>
542 <link linkend="zend.controller.actionhelpers">action helpers</link>
544 Como parte de este cambio, los siguientes métodos han sido removidos ya
547 <link linkend="zend.controller.actionhelpers.redirector">redirector
555 <methodname>setRedirectCode()</methodname>
557 <methodname>Zend_Controller_Action_Helper_Redirector::setCode()</methodname>
563 <methodname>setRedirectPrependBase()</methodname>
565 <methodname>Zend_Controller_Action_Helper_Redirector::setPrependBase()</methodname>
571 <methodname>setRedirectExit()</methodname>
573 <methodname>Zend_Controller_Action_Helper_Redirector::setExit()</methodname>
580 Leer la documentación
581 <link linkend="zend.controller.actionhelpers">ayudantes
583 para obtener más información sobre cómo
584 recuperar y manipular objetos de ayuda, y la
585 <link linkend="zend.controller.actionhelpers.redirector"> documentación
586 del ayudante redirector</link>
587 para obtener más información sobre la configuración
588 de reorientar las opciones (así como los alternativos métodos para la redirección).
592 <sect2 id="zend.controller.migration.fromzerosix">
593 <title>Migrando desde 0.6.0 to 0.8.0 o versiones nuevas</title>
596 Por los cambios previos, el más básico uso de los componentes
597 <acronym>MVC</acronym>
598 sigue siendo el mismo:
601 <programlisting language="php"><![CDATA[
602 Zend_Controller_Front::run('/path/to/controllers');
606 Sin embargo, la estructura de directorios se sometió a una revisión, varios
607 componentes han sido eliminados, y varios otros ya sea añadidos o adicionados.
615 <classname>Zend_Controller_Router</classname>
616 fue eliminado en favor de
617 reescribir el router.
623 <classname> Zend_Controller_RewriteRouter </classname>
625 <classname> Zend_Controller_Router_Rewrite </classname>
627 router estándar enviado con el framework;
628 <classname> Zend_Controller_Front </classname>
629 lo utilizará por defecto si
630 ningún otro router es sustituido.
636 Una nueva clase ruta para uso con el router reescribir se
638 <classname> Zend_Controller_Router_Route_Module </classname>
640 la ruta por defecto utilizado por el
641 <acronym>MVC</acronym>
642 , y tiene soporte para el
643 <link linkend="zend.controller.modular">controlador de
651 <classname>Zend_Controller_Router_StaticRoute</classname>
654 <classname>Zend_Controller_Router_Route_Static</classname>
661 <classname>Zend_Controller_Dispatcher</classname>
663 <classname>Zend_Controller_Dispatcher_Standard</classname>
671 <methodname>Zend_Controller_Action::_forward()</methodname>
672 han cambiado. la firma es ahora:
675 <programlisting language="php"><![CDATA[
676 final protected function _forward($action,
679 array $params = null);
683 <varname>$accion</varname>
684 es siempre necesaria; si ningún controlador es
685 especificado, es asumida una
686 acción en el actual controlador.
687 <varname>$module</varname>
688 es siempre ignorado a menos que
689 <varname>$controller</varname>
690 sea especificado. Por último, cualquier
691 <varname>$params</varname>
692 previsto será adjuntado a la
693 solicitud del objeto. Si no necesita el controlador
695 módulo, pero aún tienen que pasar los parámetros, basta con especificar
703 <sect2 id="zend.controller.migration.fromzerotwo">
704 <title>Migrando desde 0.2.0 o antes de 0.6.0</title>
707 El mas basico uso de los componentes de
708 <acronym>MVC</acronym>
709 no ha cambiado; se puede
710 seguir utilizando a cada uno en la siguiente manera:
713 <programlisting language="php"><![CDATA[
714 Zend_Controller_Front::run('/path/to/controllers');
717 <programlisting language="php"><![CDATA[
718 /* -- crear una ruta -- */
719 $router = new Zend_Controller_RewriteRouter();
720 $router->addRoute('user',
722 array('controller' => 'user', 'action' => 'info')
725 /* -- configurarlo en un controlador -- */
726 $ctrl = Zend_Controller_Front::getInstance();
727 $ctrl->setRouter($router);
729 /* -- configurar el directorio controladores y despahcarlos -- */
730 $ctrl->setControllerDirectory('/path/to/controllers');
735 Alentamos el uso del objeto Response para agregar contenido y
736 cabeceras. Esto permitirá
737 una mayor flexibilidad en el formato de salida intercambiando
739 <acronym>JSON</acronym>
741 <acronym>XML</acronym>
743 <acronym>XHTML</acronym>
744 ) en sus aplicaciones.
745 Por defecto, el envío
746 <methodname> distpach() </methodname>
747 enviará la respuesta, enviando ambas
748 cabeceras y enviando cuanlquier contenido. También
749 se puede tener el controlador front
750 retorne la respuesta usando
751 <methodname>returnResponse()</methodname>
753 y luego enviar la respuesta a través de su propia lógica. Una versión futura
755 controlador front puede hacer valer el uso de la respuesta a través de objetos mediante
756 la salida de buffers.
760 Hay muchas características adicionales que amplían las existentes API,
762 observadas en la documentación.
766 Los principales cambios que tendrán que ser conscientes de cuando se encuentre
768 subclase de los diversos componentes. Clave entre estos son:
774 <methodname>Zend_Controller_Front::distpach()</methodname>
776 intercepta excepciones en la respuesta del objeto, y no los envia
778 orden de prevenir un sistema de informacion sensitivo de ser
780 anular esto de varias maneras:
787 <methodname>throwExceptions()</methodname>
791 <programlisting language="php"><![CDATA[
792 $front->throwExceptions(true);
799 <methodname>renderExceptions()</methodname>
803 <programlisting language="php"><![CDATA[
804 $response->renderExceptions(true);
805 $front->setResponse($response);
809 $front->returnResponse(true);
810 $response = $front->dispatch();
811 $response->renderExceptions(true);
820 <methodname>Zend_Controller_Dispatcher_Interface::dispatch()</methodname>
821 ahora acepta y devuelve un
822 <xref linkend="zend.controller.request"/>
823 objeto en lugar de un despachador simbólico.
829 <methodname>Zend_Controller_Router_Interface::route()</methodname>
830 ahora acepta y devuelve un
831 <xref linkend="zend.controller.request"/>
832 objeto en lugar de un despachador simbólico.
838 <classname>Zend_Controller_Action</classname>
839 los cambios incluyen:
845 El constructor acepta ahora exactamente tres argumentos,
846 <classname> Zend_Controller_Request_Abstract $request</classname>
847 <classname> Zend_Controller_Response_Abstract $response</classname>
849 <methodname> array $ params (opcional) </methodname>
851 <methodname> Zend_Controller_Action::__construct()</methodname>
853 los argumentos para para configurar la petición, la respuesta, y propiedades
854 invokeArgs del objeto, y si se sobrecarga el
855 constructor se debe hacer lo mismo. Mejor aún, use
857 <methodname>init()</methodname>
858 para hacer cualquier configuración
859 a la instancia, ya que este método es llamado como la acción
860 final del constructor.
866 <methodname>run()</methodname>
867 , ya no se define como definitivo, pero es
868 también no utilizado por el controlador front; su único
869 objetivo es para el uso de la clase como un controlador de página. Ello
870 ahora tiene dos argumentos opcionales, uno
871 <classname> Zend_Controller_Request_Abstract $request</classname>
873 <classname> Zend_Controller_Response_Abstract $response</classname>
880 <methodname>indexAction()</methodname>
882 definido, pero se recomienda como acción por defecto. Esto
883 permite utilizar RewriteRouter y la acción controladores para
884 especificar los diferentes métodos de acción.
890 <methodname>__call()</methodname>
891 debería ser sobrecargado para manejar las
892 indefinidas acciones automaticamente.
898 <methodname>_redirect ()</methodname>
899 ahora toma un segundo opcional
901 <acronym>HTTP</acronym>
902 a retornar con la redirección, y
903 un opcional tercer argumento,
904 <varname>$prependBase</varname>
906 que puede indicar que la
907 <acronym>URL</acronym>
908 base registrada en la
909 solicitud del objeto debería ser añadido a la
910 <acronym>URL</acronym>
918 <methodname>_action</methodname>
919 ya no está configurada.
920 Esta propiedad fue un
921 <classname> Zend_Controller_Dispatcher_Token </classname>
923 el cual ya no existe en la actual encarnación.
924 El único propósito de la
925 muestra era proporcionar
926 información sobre la solicitud del controlador,
929 <acronym>URL</acronym>
930 . Esta información es ahora
931 disponible en la solicitud del objeto, y
936 <programlisting language="php"><![CDATA[
937 // Recuperar las solicitud del nombre del controlador
938 // El acceso ha sido a través: $this->_action->getControllerName().
939 // El ejemplo siguiente usa getRequest(), aunque se pueda acceder
940 // directamente a la $_request property; usar getRequest() es recomendado como
941 // una clase padre pueda sobrecargar el acceso a la solicitud del objeto.
942 $controller = $this->getRequest()->getControllerName();
944 // Recuperar la solicitud del nombre de la accion
945 // El acceso ha sido a través: $this->_action->getActionName().
946 $action = $this->getRequest()->getActionName();
948 // Recuperar la solicitud de los parametros
949 // Esto no ha cambiado; Los métodos _getParams() y _getParam() simplemente
950 // proxy a la solictud del objeto.
951 $params = $this->_getParams();
952 // solicitud 'foo' parametro, usando 'default' como valor por defecto si no lo encuentra
953 $foo = $this->_getParam('foo', 'default');
959 <methodname>noRouteAction()</methodname>
960 ha sido eliminado. La
961 manera adecuada de manejar inexistentes métodos
963 acciones se desearia enrutarlos a una
964 acción por defecto utilizando
965 <methodname>__call()</methodname>
969 <programlisting language="php"><![CDATA[
970 public function __call($method, $args)
972 // If an unmatched 'Action' method was requested, pass on to the
973 // default action method:
974 if ('Action' == substr($method, -6)) {
975 return $this->defaultAction();
978 throw new Zend_Controller_Exception('Invalid method called');
987 <methodname>Zend_Controller_RewriteRouter::setRewriteBase()</methodname>
990 <methodname>Zend_Controller_Front::setBaseUrl()</methodname>
992 <methodname>Zend_Controller_Request_Http::setBaseUrl()</methodname>
994 la petición de la clase).
1000 <classname>Zend_Controller_Plugin_Interface</classname>
1003 <classname> Zend_Controller_Plugin_Abstract</classname>
1004 . Ahora todos los métodos
1005 aceptan y devuelven un objeto
1006 <xref linkend="zend.controller.request"/>
1007 en lugar de un despachador simbólico.
1014 vim:se ts=4 sw=4 et: