TigerZF
🌐Español

B.11. Zend Framework 0.6

Al actualizar desde una versión anterior a Zend Framework 0.6 o superior, debe tener en cuenta las siguientes notas de migración.

B.11.1. Zend_Controller

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_Action cambios 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étodo init() 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, un Zend_Controller_Request_Abstract $request y un Zend_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 $_action ya no se establece. Esta propiedad era un Zend_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. Use Zend_Controller_Front::setBaseUrl() en su lugar (o Zend_Controller_Request_Http::setBaseUrl(), si utiliza esa clase request).

  • Zend_Controller_Plugin_Interface fue reemplazado por Zend_Controller_Plugin_Abstract. Todos los métodos ahora aceptan y devuelven un El objeto Request en lugar de un token de dispatcher.