2

In my bundle, I want to take advantage of the kernel.terminate event to flush some statistics about webservice api call. Yet, I didn't find any resources to do it in the best way.

On a listener GuzzleExceptionListener (his role is to intercept every fail webservice call) in which i've injected the EntityManger service. :

if ($exception instanceof BadResponseException) {
    $entityManager = $this->entityManager;

    $dispatcher = new EventDispatcher;
    $dispatcher->addListener('kernel.terminate', function (Event $event) use ($entityManager) {
        $repository = $entityManager->getRepository("somerepository");
        // do some treatment for stats
        $entityManager->persist($apicall);
        $entityManager->flush();
    });
}

The declaration of the GuzzleExceptionListener :

<service id="my_service" class="%my_class%">
    <tag name="kernel.event_listener" event="kernel.exception" method="onKernelException" />
    <argument type="service" id="doctrine.orm.entity_manager" />
</service>

Anyhow, this closure is not called when the event kernel.terminate is fired. Why ? Is it because it's inside a listener itself ?

4

1 に答える 1

5

@event_dispatcherリスナー内に新しいものを作成する代わりに、symfony の構成済みイベント ディスパッチャー サービス ( ) を注入する必要があります。

それを作成してイベントリスナーを追加するだけの場合、symfony はこの新しく作成されたEventDispatcherオブジェクトへの参照をまだ持っていないため、それを使用しません。

<service id="my_service" class="%my_class%">
    <tag name="kernel.event_listener" event="kernel.exception" method="onKernelException" />
    <argument type="service" id="doctrine.orm.entity_manager" />
    <argument type="service" id="event_dispatcher" />
 </service>
于 2013-07-16T14:28:51.430 に答える