Bonjour,

Je viens vers vous pour vous faire part de mon expérience et en même temps essayer de trouver une explication a mon problème.

Je travaille sur un bundle qui va prendre la main sur le kernel.view, pendant la phase de prototypage j'ai tendance à utiliser des listeners, puis une fois le prototype fini je passe par des subscribers.

Mais lors de cette phase finale, l'évènement dispatché n'est pas entendu.

J'ai isolé le problème pour que vous puissiez l'analyser de votre côté.

Pour tester il vous suffit de créer un bundle AcmeTestBundle et de placer la configuration suivante :
Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?xml version="1.0" ?>
 
<container xmlns="http://symfony.com/schema/dic/services"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
 
    <parameters>
        <parameter key="acme_test.request_listener.class">Acme\TestBundle\EventListener\KernelListener</parameter>
        <parameter key="acme_test.request_subscriber.class">Acme\TestBundle\EventListener\KernelSubscriber</parameter>
    </parameters>
 
    <services>
 
        <service id="acme_test.request_listener" class="%acme_test.request_listener.class%">
            <tag name="kernel.event_listener" event="kernel.request" method="onKernelRequest" />
            <tag name="kernel.event_listener" event="kernel.view" method="onKernelView" />
            <argument type="service" id="logger" />
        </service>
 
        <service id="acme_test.request_subscriber" class="%acme_test.request_subscriber.class%">
		    <tag name="kernel.event_subscriber" />
            <argument type="service" id="logger" />
        </service>
 
    </services>
</container>

Ensuite, vous devez créer un répertoire EventListener et placer les deux class suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?php
 
namespace Acme\TestBundle\EventListener;
 
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Bridge\Monolog\Logger;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\Event\GetResponseForControllerResultEvent;
 
class KernelSubscriber implements EventSubscriberInterface
{
    protected $monolog;
 
    public function __construct(Logger $monolog)
    {
        $this->monolog = $monolog;
    }
 
    static public function getSubscribedEvents()
    {
        return array(
            'kernel.request' => array('onKernelRequest'),
            'kernel.view' => array('onKernelView'),
        );
    }
 
    public function onKernelRequest(GetResponseEvent $event)
    {
		$this->monolog->info('KernelSubscriber::onKernelRequest a récupéré l\'évènement ');
    }
 
    public function onKernelView(GetResponseForControllerResultEvent $event)
    {
		$this->monolog->info('KernelSubscriber::onKernelView a récupéré l\'évènement ');
    }
}
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
 
namespace Acme\TestBundle\EventListener;
 
use Symfony\Bridge\Monolog\Logger;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\Event\GetResponseForControllerResultEvent;
 
class KernelListener
{
    protected $monolog;
 
    public function __construct(Logger $monolog)
    {
        $this->monolog = $monolog;
    }
 
 
    public function onKernelRequest(GetResponseEvent $event)
    {
		$this->monolog->info('KernelListener::onKernelRequest a récupéré l\'évènement ');		
    }
 
    public function onKernelView(GetResponseForControllerResultEvent $event)
    {
		$this->monolog->info('KernelListener::onKernelView a récupéré l\'évènement ');		
    }
}
Puis il ne vous reste plus qu'à vous rendre sur une page (app_dev.php/demo/ ) et regarder vos logs.

Comme vous pouvez le constater le subscriber n'appelle pas la function onKernelView.

  • INFO - KernelListener::onKernelRequest a récupéré l'évènement
  • INFO - KernelSubscriber::onKernelRequest a récupéré l'évènement
  • INFO - KernelListener::onKernelView a récupéré l'évènement


En attendant, je peux m'en sortir avec un listener.

Toutefois, si quelqu'un est en mesure de m'expliquer le pourquoi du comment, je me sentirais moins c...

Cordialement

Chris