2010-03-01 21 views
10

Estoy tratando de centralizar mis redireccionamientos (basados ​​en la autenticación y varios otros estados) en un plugin de controlador frontal. Hasta ahora he intentado:Redirigir al frente Plugin del controlador Zend

$this->setRequest(new Zend_Controller_Request_Http('my_url')); 

en varios puntos en el plug-in (es decir, desde routeStartup a dispatchLoopShutdown) y también:

$this->setResponse(new Zend_Controller_Response_Http('my_url')); 

¿Alguien puede ofrecer alguna ayuda en esto, o me punto en el dirección de un tutorial?

Respuesta

23

Si está buscando redirigir si el usuario no está conectado, el primer parámetro de dispatchLoopStartup() es un manejador del objeto de solicitud.

public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request) 
{ 
    if(!Zend_Auth::getInstance()->hasIdentity()) 
    { 
     $request->setControllerName('auth'); 
     $request->setActionName('login'); 
     // Set the module if you need to as well. 
    } 
} 
+0

ah - Creo que eso es lo que estaba buscando. Quiero evitar usar el redirector (que ya está en uso) e interceptar la solicitud en el origen. Gracias por su ayuda, voy a darle un giro. – sunwukung

+0

Tenga en cuenta que esto no genera un redireccionamiento HTTP o crea una nueva solicitud, pero reenviar/modificar la solicitud ES mejor: buena respuesta. –

+0

Redirigir y reenviar a menudo se confunden en Zend Framework.Es importante entender las diferencias. En su pregunta, dice redirigir, pero creo que lo que realmente quiere decir es reenviar. – smack0007

28

La forma más fácil sería utilizar de ZF redirección ActionHelper

$r = Zend_Controller_Action_HelperBroker::getStaticHelper('redirector'); 
    $r->gotoUrl('/some/url')->redirectAndExit(); 

Alternativamente instanciarlo sin la HelperBroker

$r = new Zend_Controller_Action_Helper_Redirector; 
    $r->gotoUrl('/some/url')->redirectAndExit(); 

El ActionHelper proporciona una API exclusivamente preocupado por la reorientación a través de una serie de métodos, como gotoRoute, gotoUrl, gotoSimple, que puede usar dependiendo de su desi rojo UseCase.

Internamente, el ActionHelper utiliza las API de Response y Router para hacer el redireccionamiento, por lo que también puede usar sus métodos directamente, p.

$request->setModuleName('someModule') 
      ->setControllerName('someController') 
      ->setActionName('someAction'); 

o

$response->setRedirect('/some/url', 200); 

Lectura adicional:

+0

gracias por eso, debería haber mencionado que estoy tratando de evitar el uso del redirector (que ya estoy usando en los controladores), y quiero interceptar la solicitud/respuesta directamente. Gracias por los enlaces, les haré un vistazo mañana. – sunwukung

3

Si desea redirigir en la página de índice, entonces esto debería ser suficiente.

public function preDispatch(Zend_Controller_Request_Abstract $request) 
{ 
    if(!Zend_Auth::getInstance()->hasIdentity()) 
    { 
      $baseUrl = new Zend_View_Helper_BaseUrl(); 
      $this->getResponse()->setRedirect($baseUrl->baseUrl()); 
    } 
} 

Si desea redirigir a otro lugar y luego simplemente cambiar el parámetro de la función setRedirect()

Gracias! :)

Cuestiones relacionadas