Al actualizar desde una versión anterior a Zend Framework 0.6 o superior, debe tener en cuenta las siguientes notas de migración.
El uso más básico de los componentes MVC no ha cambiado; todavía puede hacer cada una de las siguientes acciones:
Zend_Controller_Front::run('/path/to/controllers');
/* -- create a router -- */
$router = new Zend_Controller_RewriteRouter();
$router->addRoute('user',
'user/:username',
array('controller' => 'user', 'action' => 'info')
);
/* -- set it in a controller -- */
$ctrl = Zend_Controller_Front::getInstance();
$ctrl->setRouter($router);
/* -- set controller directory and dispatch -- */
$ctrl->setControllerDirectory('/path/to/controllers');
$ctrl->dispatch();
Recomendamos el uso del objeto Response para agregar contenido y
cabeceras. Esto permitirá un cambio más flexible del formato de salida
(por ejemplo, JSON o XML en lugar de
XHTML) en sus aplicaciones.
Por defecto, dispatch() renderizará la respuesta, enviando tanto
las cabeceras como renderizando cualquier contenido. También puede hacer que el front
controller devuelva la respuesta usando returnResponse(),
y luego renderizar la respuesta usando su propia lógica. Una futura versión
del front controller puede forzar el uso del objeto response mediante
almacenamiento en búfer de salida (output buffering).
Hay muchas características adicionales que extienden la API existente, y estas se indican en la documentación.
Los principales cambios de los que debe ser consciente se encontrarán al subclasificar los diversos componentes. Entre los más destacados:
-
Zend_Controller_Front::dispatch()por defecto captura las excepciones en el objeto response, y no las renderiza, para evitar que se muestre información sensible del sistema. Puede anular esto de varias formas:-
Establecer
throwExceptions()en el front controller:$front->throwExceptions(true);
-
Establecer
renderExceptions()en el objeto response:$response->renderExceptions(true); $front->setResponse($response); $front->dispatch(); // or: $front->returnResponse(true); $response = $front->dispatch(); $response->renderExceptions(true); echo $response;
-
Zend_Controller_Dispatcher_Interface::dispatch()ahora acepta y devuelve un El objeto Request en lugar de un token de dispatcher.Zend_Controller_Router_Interface::route()ahora acepta y devuelve un El objeto Request en lugar de un token de dispatcher.-
Zend_Controller_Actioncambios incluidos:El constructor ahora acepta exactamente tres argumentos,
Zend_Controller_Request_Abstract$request,Zend_Controller_Response_Abstract$response, y Array$params(opcional).Zend_Controller_Action::__construct()usa estos para establecer las propiedades request, response e invokeArgs del objeto, y si se anula el constructor, debe hacer lo mismo. Aún mejor, use el métodoinit()para realizar cualquier configuración de instancia, ya que este método se llama como acción final del constructor.run()ya no está definido como final, pero tampoco lo utiliza ya el front controller; su único propósito es usar la clase como page controller. Ahora toma dos argumentos opcionales, unZend_Controller_Request_Abstract$requesty unZend_Controller_Response_Abstract$response.indexAction()ya no necesita ser definido, pero se recomienda como acción por defecto. Esto permite usar el RewriteRouter y los action controllers para especificar diferentes métodos de acción por defecto.__call()debe ser anulado para manejar automáticamente cualquier acción indefinida._redirect()ahora toma un segundo argumento opcional, el código HTTP con el que responder en la redirección, y un tercer argumento opcional,$prependBase, que puede indicar que la URL base registrada con el objeto request debe anteponerse a la url especificada.-
La propiedad
$_actionya no se establece. Esta propiedad era unZend_Controller_Dispatcher_Token, que ya no existe en la encarnación actual. El único propósito del token era proporcionar información sobre el controlador, la acción y los parámetros de URL solicitados. Esta información ahora está disponible en el objeto request, y se puede acceder de la siguiente manera:// Retrieve the requested controller name // Access used to be via: $this->_action->getControllerName(). // The example below uses getRequest(), though you may also directly // access the $_request property; using getRequest() is recommended as // a parent class may override access to the request object. $controller = $this->getRequest()->getControllerName(); // Retrieve the requested action name // Access used to be via: $this->_action->getActionName(). $action = $this->getRequest()->getActionName(); // Retrieve the request parameters // This hasn't changed; the _getParams() and _getParam() methods simply // proxy to the request object now. $params = $this->_getParams(); // request 'foo' parameter, using 'default' as default value if not found $foo = $this->_getParam('foo', 'default'); -
noRouteAction()ha sido eliminado. La forma adecuada de manejar métodos de acción inexistentes, si desea enrutarlos a una acción por defecto, es usar__call():public function __call($method, $args) { // If an unmatched 'Action' method was requested, pass on to the // default action method: if ('Action' == substr($method, -6)) { return $this->defaultAction(); } throw new Zend_Controller_Exception('Invalid method called'); }
Zend_Controller_RewriteRouter::setRewriteBase()ha sido eliminado. UseZend_Controller_Front::setBaseUrl()en su lugar (oZend_Controller_Request_Http::setBaseUrl(), si utiliza esa clase request).Zend_Controller_Plugin_Interfacefue reemplazado porZend_Controller_Plugin_Abstract. Todos los métodos ahora aceptan y devuelven un El objeto Request en lugar de un token de dispatcher.