Bonjour,
Dans mon projet Symfony2, j'aimerais exécuter une fonction avant chaque appel de contrôleur, quel qu'il soit. Cette fonction manipule la base de données et doit donc avoir accès à l'EntityManager. J'ai donc créé un service en tant que Listener afin qu'il soit appelé avant chaque appel de contrôleur, en ajoutant dans services.yml :
J'ai donc passé l'EntityManager en paramètre du service. Le code du service est le suivant (ce code a été réduit au minimum pour mettre en valeur l'erreur, mais si je parviens à faire fonctionner ce code le reste suivra) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 services: site.service_test: class: Site\TestBundle\Test\ServiceTest arguments: [@doctrine.orm.entity_manager] tags: - { name: kernel.event_listener, event: kernel.controller, method: onKernelController }
Je précise que j'ai volontairement réduit le code, en pratique cette classe contiendra un attribut privé contenant l'EntityManager, on appellera les méthodes de cet attribut pour accéder à Doctrine. Ne cherchez donc pas la logique du code, je veux juste savoir pourquoi ce code simplissime ne fonctionne pas.
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 <?php namespace Site\TestBundle\Test; use Symfony\Component\HttpKernel\Event\FilterControllerEvent; use Symfony\Component\HttpKernel\HttpKernelInterface; class ServiceTest { public function __construct($em) { $em->getDoctrine(); // Affiche FatalErrorException: Error: Call to undefined method Doctrine\ORM\EntityManager::getDoctrine() in... } public function onKernelController(FilterControllerEvent $event) { } }
Mon problème semble bête mais je suis bloqué depuis un moment dessus, je ne comprend pas pourquoi je ne parviens pas à utiliser l'EntityManager passé en paramètre de service...
Voici ce qu'affiche var_dump($em) si je l'exécute au début du constructeur (je n'affiche que le début car l'affichage est très long) :
(Ce n'est que le début de l'affichage pour donner une idée, perso je ne vois pas d'où vient l'erreur)
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 object(Doctrine\ORM\EntityManager)[189] private 'config' => object(Doctrine\ORM\Configuration)[202] protected '_attributes' => array (size=12) 'entityNamespaces' => array (size=4) ... 'metadataCacheImpl' => object(Doctrine\Common\Cache\ArrayCache)[211] ... 'queryCacheImpl' => object(Doctrine\Common\Cache\ArrayCache)[210] ... 'resultCacheImpl' => object(Doctrine\Common\Cache\ArrayCache)[209] ... 'metadataDriverImpl' => object(Doctrine\ORM\Mapping\Driver\DriverChain)[205] ... 'proxyDir' => string 'C:/wamp/www/Site/app/cache/dev/doctrine/orm/Proxies' (length=54) 'proxyNamespace' => string 'Proxies' (length=7) 'autoGenerateProxyClasses' => boolean true 'classMetadataFactoryName' => string 'Doctrine\ORM\Mapping\ClassMetadataFactory' (length=41) 'defaultRepositoryClassName' => string 'Doctrine\ORM\EntityRepository' (length=29) 'namingStrategy' => object(Doctrine\ORM\Mapping\DefaultNamingStrategy)[201] ... 'quoteStrategy' => object(Doctrine\ORM\Mapping\DefaultQuoteStrategy)[275] ...
Merci beaucoup à ceux qui pourraient m'aider
Partager