【问题标题】:Response Event listener for a specific action特定操作的响应事件侦听器
【发布时间】:2014-05-10 21:47:47
【问题描述】:

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

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

我找不到这个明确显示的文档

【问题讨论】:

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

标签: symfony symfony-2.1


【解决方案1】:

也许您可以使用事件分派器组件来创建您自己的事件,并在您想要的操作中分派它。信息在这里:The EventDispatcher Component

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2022-01-10
        • 1970-01-01
        • 2016-08-05
        • 1970-01-01
        • 2018-09-04
        • 2014-08-28
        • 2013-10-28
        • 1970-01-01
        • 2021-09-28
        相关资源
        最近更新 更多