Symfony 特定操作的响应事件侦听器

Symfony 特定操作的响应事件侦听器,symfony,symfony-2.1,Symfony,Symfony 2.1,我有一个事件监听器,其方法如下 public function onKernelResponse(FilterResponseEvent $event,EntityManager $entityManager) { $controller = $event->getController(); if (!is_array($controller)) { return; } if ($controller[0] instanceof U

我有一个事件监听器,其方法如下

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) {

        }
    }


}
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 }
我的服务.yml看起来像这样

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) {

        }
    }


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


我找不到文档中明确显示的内容

也许您可以使用event dispacher组件创建自己的事件,并在所需的操作中分派它。此处信息:

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

if ($controller[0] instanceof UserController) {

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

         ...

抛出自定义异常并执行以下操作如何:

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

如果您需要运行的代码特定于特定控制器上的特定方法,为什么不将其放在该控制器方法中而不是事件中?我只是不想让控制器在调用其他服务时过于混乱。如果您使用事件来解耦一些不应该真正解耦的东西,那么它会使控制器变得混乱不必要地编码。您计划从事件侦听器调用哪些服务?