Dispatch事件多次发生

时间:2016-02-17 18:46:42

标签: php symfony

我在Symfony中使用调度事件,我不明白,因为我有两次kernel.response

控制器:

/**
 * @Route("/evento", name="evento")
 */
public function eventoAction()
{
    $dispatcher = new EventDispatcher();
    $subscriber = new StoreSubriber();
    $dispatcher->addSubscriber($subscriber);
    $event = new FilterOrderEvent($order);
    $dispatcher->dispatch(StoreEvents::STORE_ORDER,$event);
    return $this->render('::event.html.twig');
}

订户:

namespace AppBundle\Events;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;

class StoreSubriber implements EventSubscriberInterface
{

    public static function getSubscribedEvents()
    {
        return array(
            'kernel.request' => array(
                array('onKernelResponsePre', -10),
                array('onKernelResponseMid', 5),
                array('onKernelResponsePost', 0),
            ),
            'store.order' => array('onStoreOrder', 0),
        );
    }

    public function onKernelResponsePre(GetResponseEvent $event)
    {
        echo "<br>";
        echo "onKernelResponsePre";
    }

    public function onKernelResponseMid(GetResponseEvent $event)
    {
        echo "<br>";
        echo "onKernelResponseMid";
    }

    public function onKernelResponsePost(GetResponseEvent $event)
    {
        echo "<br>";
        echo "onKernelResponsePost";
    }

    public function onStoreOrder(FilterOrderEvent $event)
    {
        echo "<br>";
        echo "ORDER";
    }
}

service.yml:

services:
    user_check_token:
        class: AppBundle\Events\StoreSubriber
        tags:
            - { name: kernel.event_subscriber }

我的输出:

onKernelResponseMid
onKernelResponsePost
onKernelResponsePre
ORDER
Events ( twig )


onKernelResponseMid
onKernelResponsePost
onKernelResponsePre

我的问题是,为什么我会看到onKernelResponseMidonKernelResponsePostonKernelResponsePre两次?

1 个答案:

答案 0 :(得分:0)

我会说,因为你订阅了两次这个活动。

  • 首先进入eventoAction $dispatcher->addSubscriber($subscriber);
  • 其次,在您的配置tags: - { name: kernel.event_subscriber }
  • 中标记您的订阅者

尝试从eventoAction中删除此$dispatcher->addSubscriber($subscriber);

修改

其他可能的原因

  • 多个内核事件事件可以为每个请求触发,symfony可以在运行代码期间的任何地方进行子请求。这也可以像这样:{{ render(controller('AcmeArticleBundle:Article:recentArticles') }}。由于这是另一个真实的请求,事件将触发。要处理此问题,您需要向订阅者添加条件以仅过滤您要处理的请求
  • 如果使用prod环境清除缓存,则可以缓存两次注册的订户。

编辑2

如何调试子请求

要轻松找出是否有任何子请求在哪里,您可以查看Web调试工具栏。

  • 转到整页视图(点击任意部分)
  • 左上角找到链接&#34;最后10&#34; (意思是显示最后10个请求)
  • 乍看之下,您应该看到每个请求是如何一个接一个地进行的,包括它们的网址和时间,以及可以进行该请求的全页调试。

这样您就可以找到是否有任何子请求及其来源。