2014-03-31 48 views
3

我有一个事件监听器,用的方法看起来像这样回复事件侦听特定动作

public function onKernelResponse(FilterResponseEvent $event,EntityManager $entityManager) 
{ 

    $controller = $event->getController(); 

    if (!is_array($controller)) { 
     return; 
    } 



    if ($controller[0] instanceof UserController) { 

     //@TODO limit this for Controller action editUser() only 

     $response = $event->getResponse()->getContent(); 
     $responseDecoded = json_decode($response); 
     if ($responseDecoded instanceof UserProperties) { 

     } 
    } 


} 

我services.yml看起来像这样

update_user_controller_listener_marking_tasks: 
     class: Company\UserResultBundle\EventListener\UserEditListener 
     arguments: [@doctrine.orm.entity_manager] 
     tags: 
      - { name: kernel.event_listener, event: kernel.response, method: onKernelResponse } 

问题的侦听器运行在该用户控制器中执行的每个操作都是我不想要的。

我的问题是我如何限制只能在特定动作的响应下运行。让我们说editUser()

我没能找到这明确显示的文档

+2

如果你的代码需要运行特定于特定控制器上的特定方法,为什么不把它放在控制器方法中而不是事件中? – redbirdo

+0

我只是不想让控制器太乱,无法调用其他服务。 – Confidence

+1

如果您使用事件来解耦某些不应该真正解耦的事物,它往往会不必要地混淆代码。你打算从事件监听器调用哪些服务? – redbirdo

回答

6

您可以检查$controller[1]价值 - 它包含了控制器的操作方法名称:

if ($controller[0] instanceof UserController) { 

    // limit this for Controller action editUser() only 
    if ($controller[1] === 'editUserAction') { 

     ... 
1

如何抛出一个自定义异常,并做到这一点:

public function onKernelException(GetResponseForExceptionEvent $event) 
{ 
    // You get the exception object from the received event 
    $exception = $event->getException(); 
    if('Some\Namespace\ApiException' == get_class($exception)){ 
     $res = new JsonResponse([ 
      'message'=>$exception->getMessage(), 
     ], 500); 
     $event->setResponse($res); 
    } 
}