이벤트 리스너를 만들고 controller
의 onBootstrap
에 연결했습니다. 문제는 컨트롤러 동작이 호출 된 후 __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());
}
}