2010-03-01 12 views
10

Sto provando a centralizzare i miei reindirizzamenti (basati sull'autenticazione e vari altri stati) in un plug-in del controller anteriore. Finora ho provato:Reindirizza nel plug-in Front Controller Zend

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

in vari punti nel plugin (cioè da routeStartup a dispatchLoopShutdown) e anche:

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

Qualcuno può offrire qualche aiuto su questo, o indicarlo nel direzione di un tutorial?

risposta

23

Se si sta cercando di reindirizzare se l'utente non lo ha registrato, il primo parametro di dispatchLoopStartup() è un handle per l'oggetto richiesta.

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 - Penso che sia quello che stavo cercando. Voglio evitare di usare il redirector (che è già in uso) e intercettare la richiesta all'origine. Grazie per il tuo aiuto, gli darò un vortice. – sunwukung

+0

Si noti che questo non emette un reindirizzamento HTTP o crea una nuova richiesta, ma inoltra/modifica la richiesta È meglio - bella risposta. –

+0

Il reindirizzamento e l'inoltro sono spesso confusi in Zend Framework.È importante capire le differenze. Nella sua domanda dice reindirizzamento, ma penso che quello che in realtà significa sia l'inoltro. – smack0007

28

Il modo più semplice sarebbe quella di utilizzare ZF reindirizzamento ActionHelper

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

alternativa un'istanza senza HelperBroker

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

L'ActionHelper fornisce un'API riguarda esclusivamente sul reindirizzamento attraverso una serie di metodi, come gotoRoute, gotoUrl, gotoSimple, che è possibile utilizzare in base al proprio rosso UseCase.

Internamente, ActionHelper utilizza le API di Response e Router per eseguire il reindirizzamento, quindi è possibile utilizzare direttamente i loro metodi, ad es.

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

o

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

Letture:

+0

grazie per quello, avrei dovuto dire che sto cercando di evitare di usare il redirector (che sto già usando nei controller), e voglio intercettare direttamente la richiesta/risposta. Grazie per i link, domani darò un'occhiata. – sunwukung

3

Se si desidera reindirizzare nella pagina di indice, allora questo dovrebbe essere sufficiente.

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

Se si desidera reindirizzare da qualche altra parte poi basta modificare il parametro nella funzione setRedirect()

Grazie! :)

Problemi correlati