特定操作的响应事件监听器

4
我有一个事件侦听器,其中的方法看起来像这样。
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
1
我只是不想在控制器中调用其他服务,使其变得混乱不堪。 - Confidence
1
如果您使用事件来解耦本不应该解耦的内容,那么它往往会使代码变得不必要地混乱。您计划从事件监听器调用哪些服务? - redbirdo
3个回答

9
你可以检查$controller[1]的值 - 它包含控制器的操作方法名称:
if ($controller[0] instanceof UserController) {

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

         ...

2
如何抛出自定义异常并执行以下操作:
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);
    }
}

0

也许你可以使用事件分派器组件来创建自己的事件,并在你想要的操作中进行分派。这里有更多信息:事件分派器组件


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接