Zend Framework 2: cómo colocar una redirección en un módulo, antes de que la aplicación llegue a un controlador

Digamos que tenemos un módulo llamado Carro y queremos redirigir a los usuarios si se cumple alguna condición. Quiero colocar una redirección en la etapa de arranque del módulo, antes de que la aplicación llegue a cualquier controlador.

Así que aquí está el código del módulo:

 

Quería usar el plugin de controlador Url, pero parece que la instancia del controlador no está disponible en esta etapa, al menos no sé cómo conseguirlo.

Gracias por adelantado

Esto debería hacer el trabajo necesario:

 getRouter()->assemble(array(), array('name' => 'login')); $response=$e->getResponse(); $response->getHeaders()->addHeaderLine('Location', $url); $response->setStatusCode(302); $response->sendHeaders(); // When an MvcEvent Listener returns a Response object, // It automatically short-circuit the Application running // -> true only for Route Event propagation see Zend\Mvc\Application::run // To avoid additional processing // we can attach a listener for Event Route with a high priority $stopCallBack = function($event) use ($response){ $event->stopPropagation(); return $response; }; //Attach the "break" as a listener with a high priority $e->getApplication()->getEventManager()->attach(MvcEvent::EVENT_ROUTE, $stopCallBack,-10000); return $response; } } } ?> 

Por supuesto, le da un error porque debe unir a su oyente a un evento. En el siguiente ejemplo, uso SharedManager y adjunto el oyente a AbstractActionController .

Por supuesto, puede conectar a su oyente a otro evento. A continuación se muestra solo un ejemplo de trabajo para mostrarle cómo funciona. Para más información, visite http://framework.zend.com/manual/2.1/en/modules/zend.event-manager.event-manager.html .

 public function onBootstrap($e) { $e->getApplication()->getEventManager()->getSharedManager()->attach('Zend\Mvc\Controller\AbstractActionController', 'dispatch', function($e) { $controller = $e->getTarget(); if (something.....) { $controller->plugin('redirect')->toRoute('yourroute'); } }, 100); } 

La página no está redirigiendo correctamente en caso de error

 public function onBootstrap($e) { $e->getApplication()->getEventManager()->getSharedManager()->attach('Zend\Mvc\Controller\AbstractActionController', 'dispatch', function($e) { if(someCondition==true) { $controller->plugin('redirect')->toRoute('myroute'); } } 

Puedes probar esto

 $front = Zend_Controller_Front::getInstance(); $response = new Zend_Controller_Response_Http(); $response->setRedirect('/profile'); $front->setResponse($response);