2011-01-02 9 views
2

Ich vermute, dass es ein Problem mit Controller-Plugins gibt, die umleiten, wenn sie in Zend Test verwendet werden?Zend_Test & Controller Plugins für ACL (Redirecting)

Ich habe ein Controller-Plugin wie http://pastie.org/1422639 Ich habe Echo-Anweisungen zum Debuggen gestellt. Ich habe Code zum Umlenken um sich einzuloggen, wenn der Benutzer nicht in

if (!$auth->hasIdentity()) { 
    echo 'no id, '; 
    // redirect to login page 
    $req->setDispatched(true); 
    $redirector = Zend_Controller_Action_HelperBroker::getStaticHelper('redirector');echo 'got redir, '; 
    $redirector->gotoUrl('/auth/login?returnUrl=' . urlencode($req->getRequestUri()));echo 'redirecting, '; 
} ... 

angemeldet ist, finde ich, dass, wenn das Gerät Tesing, zB

$this->dispatch('/projects'); 

Der Ausgang war ich bekam

Projekte (ok I Ich habe die Projektseite/Controller angefordert), keine ID (ok, ich bin nicht eingeloggt), habe redir (ich habe den Redirector ok), Redirect (es scheint, als würde es umgeleitet werden ...), Fehler (aber ich kam zum Fehlercontroller) keine Ressource,

der Grund, warum ich an den Fehler-Controller kam es scheint, ist ich noch auf die Projekte/Indexseite. im Index Aktion, ging ich davon aus, dass der Benutzer angemeldet ist. Aber wenn versucht, es zu der in Benutzer

$user = \Zend_Auth::getInstance()->getIdentity(); 

angemeldet erhalten Sie versagt ...

Wie kann ich Redirectoren in Zend-Test zu arbeiten? Oder vielleicht ist es kein Problem mit Redirectors?

Antwort

3

Es ist ein zweiteiliges Problem. Zuerst ruft der Redirector standardmäßig nach der Weiterleitung PHP auf, was dazu führt, dass Zend_Test die Ausführung beendet. In Ihren Tests müssen Sie den Redirector konfigurieren, dies nicht zu tun. Etwas wie folgt aus:

$redirector = new Zend_Controller_Action_Helper_Redirector(); 
if (APPLICATION_ENV == 'testing') { 
    $redirector->setExit(false); 
} 
$redirector->gotoUrl("/blah/blah"); 

Aber das Problem in Controller-Plugins ist, dass ein Redirector nach der Anwendung, es gibt keinen Weg Zend Framework zu verhindern, dass in die Dispatch Schleife gehen und zu versuchen, eine Aktion Methode ohnehin auszuführen. Ich habe in verschiedenen Form-Posts gelesen (kann mich nicht erinnern, woher das kommt), dass dies ein bekanntes Problem in Zend Framework ist, das die Entwickler angehen wollen. Vorerst ich durch das Hinzufügen einer Methode, wie diese in meinen Fehler-Controller dieses Problem umgehen:

public function pluginRedirectorAction() { 
    $this->_helper->layout()->disableLayout(); 
    $this->_helper->viewRenderer->setNoRender(); 

    $code = $this->_getParam('code'); 
    $uri = $this->_getParam('uri'); 

    if (APPLICATION_ENV == 'testing') { 
     $this->_helper->redirector->setExit(false); 
    } 
    $this->_helper->redirector->setCode($code); 
    $this->_helper->redirector->gotoUrl($uri); 
} 

Da ist in meinem Controller Plugins, habe ich eine eigene Methode für den Aufruf eine Weiterleitung:

protected function redirect($code, $uri) { 
    $redirector = new Zend_Controller_Action_Helper_Redirector(); 

    if (APPLICATION_ENV == 'testing') { 
     $request = $this->getRequest(); 
     $request->setModuleName('default'); 
     $request->setControllerName('error'); 
     $request->setActionName('plugin-redirector'); 
     $request->setParam('code', $code); 
     $request->setParam('uri', $uri); 

     $redirector->setExit(false); 
    } 

    $redirector->setCode($code); 
    $redirector->gotoUrl($uri); 
} 

Dadurch Dadurch verschieben Sie den tatsächlichen Aufruf des Redirectors in den Controller-Layer Ihrer App, wodurch der Komponententest ordnungsgemäß funktioniert (auch bekannt als $this->assertRedirectTo('/blah/blah');). Dies ändert die Anforderung, auf die pluginRedirectorAction()-Methode in Ihrem oben gezeigten Fehlercontroller zu zeigen. Umleitungen innerhalb der Controller-Plugins wird nun wie folgt aufgerufen:

return $this->redirect(307, '/somewhere/else'); 

Aber es wird nicht aus der routeStartup() Methode arbeiten, weil ZF die Router direkt danach Brände, die die Anforderungsparameter außer Kraft gesetzt werden, die die redirect() Methode angegeben . Sie müssen die Installation Ihres Plugins erneut bearbeiten, um Ihre Weiterleitungen von routeShutdown() oder anderen Methoden aufzurufen, die später im Versandzyklus aufgerufen werden. (Ich habe dies nur innerhalb routeShutdown() getestet.)