2014-11-08 5 views
1

이벤트 리스너를 만들고 controlleronBootstrap에 연결했습니다. 문제는 컨트롤러 동작이 호출 된 후 __invoke 함수가 호출된다는 것입니다. 이걸 제외하고는 모두 잘 작동합니다.젠드 프레임 워크 2에서 컨트롤러 작업 후에 호출 된 리스너 클래스의 __invoke

공장

public function getServiceConfig() { 
     return array(
      'factories' => array(
       'Api\Adapter\HeaderAuthentication' => 'Api\Factory\AuthenticationAdapterFactory', 
       'Api\Listener\AuthenticationListener' => 'Api\Factory\AuthenticationListenerFactory', 
      ), 
     ); 
    } 

부트 스트랩

public function onBootstrap(MvcEvent $e) { 
     $app = $e->getApplication(); 
     $sm = $app->getServiceManager(); 
     $em = $app->getEventManager(); 

     $moduleRouteListener = new ModuleRouteListener(); 
     $moduleRouteListener->attach($em); 

     $listener = $sm->get('Api\Listener\AuthenticationListener'); 
     $em->getSharedManager()->attach('Api\Controller', 'dispatch', $listener); 
    } 

나는 기본 컨트롤러 Zend\Mvc\Controller\AbstractRestfulController 유형의 Api\Controller 만든 후 나는 다른 모든 컨트롤러에이 컨트롤러를 상속 할 수 있습니다.

ListenerFactory

class AuthenticationListener { 

    protected $adapter; 

    public function __construct(HeaderAuthentication $adapter) { 
     $this->adapter = $adapter; 
     die('died in listener'); // this executes before controller execution. 
    } 

    public function __invoke(MvcEvent $event) { // this executes after controller action execution 
     $result = $this->adapter->authenticate(); 
     die('died in listener'); 
     if(!$result->isValid()){ 
      $response = $event->getResponse(); 
      $response->setStatusCode(400); 

      $responseMessages = ''; 
      foreach($result->getMessages() as $message) { 
       $responseMessages .= $message . '. '; 
      } 
      $response->setContent($responseMessages); 
      return $response; 
     } 

     $event->setParam('user', $result->getIdentity()); 

    } 

} 

답변

1

좋아

class AuthenticationListenerFactory implements FactoryInterface 
{ 
    public function createService(ServiceLocatorInterface $sl) 
    { 
     $name = 'Api\Adapter\HeaderAuthentication'; 
     $adapter = $sl->get($name); 

     $listener = new AuthenticationListener($adapter); 
     return $listener; 
    } 
} 

AuthenticationListener는 내가 발견 한 것은 흥미 롭다. ZF2 postDispatchpreDispatch에서 이벤트의 우선 순위를 지정하여 동작을 수행 할 수 있습니다. 이와 같이 이벤트에 우선 순위를 추가하기 만하면됩니다.

$em->getSharedManager()->attach('Api\Controller', 'dispatch', $listener, 100); 

기본적으로 이벤트의 우선 순위는 1입니다. 우선 순위가 1보다 큰 모든 이벤트는 액션 전에 호출되며 preDispatch으로 동작합니다. 1보다 작거나 같은 숫자는 postDispatch이됩니다.

$em->getSharedManager()->attach('Api\Controller', 'dispatch', $listener); // postDispatch 
$em->getSharedManager()->attach('Api\Controller', 'dispatch', $listener, 100); // preDispatch 
$em->getSharedManager()->attach('Api\Controller', 'dispatch', $listener, -100); // postDispatch