2011-01-02 3 views
2

Zend Test에서 컨트롤러 플러그인을 리디렉션하는 데 문제가있는 것으로 의심됩니다.Zend_Test 및 컨트롤러 용 ACL (리디렉션)

컨트롤러 플러그인이 있습니다. http://pastie.org/1422639 디버깅을 위해 echo 문을 넣었습니다. 나는 사용자가 내가 찾아

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, '; 
} ... 

로그인하지 않은 경우 로그인을 리디렉션에 대한 코드가 그 내가 가진 출력은 내가 확인 (

프로젝트

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

, 예를 들면 단위 tesing 때 프로젝트 페이지/컨트롤러 요청), 아이디 없음 (ok, 로그인하지 않음), 리다이렉트 (리다이렉트 OK), 리다이렉트 (리다이렉트하고있는 것처럼 보임 ...), 에러 (하지만 오류 컨트롤러) no resource,

내가 왜 오류 컨트롤러에 접속했는지는 프로젝트/색인 페이지에 여전히 표시되어있는 것 같습니다. 인덱스 행동에,

어떻게 젠드 테스트에서 작업 리디렉터를 가질 수 ... 나는 사용자가 로그인되어 있다고 가정. 그러나 때 그것은 사용자

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

실패 로그인 가려고? 아니면 리디렉터에 문제가없는 것일까 요?

답변

3

두 부분으로 나뉩니다. 첫째, 리디렉터는 기본적으로 리디렉션 후 PHP의 exit을 호출하므로 Zend_Test가 실행을 중지합니다. 테스트에서 리디렉터가이를 수행하지 않도록 구성해야합니다. 이런 식으로 뭔가 :

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

그러나 컨트롤러 플러그인에서 문제가 리디렉터를 사용 후, 디스패치 루프에 가서 어쨌든 액션 메소드를 실행하려고에서 젠드 프레임 워크를 예방할 수있는 방법이 없다는 것입니다. 나는 Zend Framework에서 알려진 문제가 개발자가 처리 할 계획이라면 다양한 형태의 게시물을 읽었습니다. 지금, 내 오류 컨트롤러에이 같은 방법을 추가하여이 문제를 해결 :함으로써

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); 
} 

: 내 컨트롤러 플러그인에서 다음

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); 
} 

, 나는 리디렉션을 호출하기위한 사용자 정의 메소드가 리디렉터에 대한 실제 호출을 앱의 컨트롤러 레이어로 이동하면 유닛 테스트가 제대로 작동합니다 (별칭 $this->assertRedirectTo('/blah/blah');). 위의 오류 컨트롤러에서 pluginRedirectorAction() 메서드를 가리키는 요청을 수정합니다. 컨트롤러 플러그인에서 지금과 같이이라고 리디렉션 :

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

그러나 ZF는 redirect() 방법은 지정된 요청 매개 변수를 대체 할 바로 그 후 라우터를 발사하기 때문에이 routeStartup() 방법 내에서 작동하지 않습니다 . routeShutdown()에서 리디렉션에 전화하거나 나중에 디스패치 사이클에서 호출되는 다른 방법으로 전화를 걸려면 플러그인 배관을 다시 작성해야합니다. (나는 이것을 routeShutdown() 안에 시험했다.)