IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

[Symfony2] Impossible d'utiliser l'EntityManager dans un service [2.x]


Sujet :

Symfony PHP

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Décembre 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Décembre 2011
    Messages : 5
    Points : 6
    Points
    6
    Par défaut [Symfony2] Impossible d'utiliser l'EntityManager dans un service
    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 :

    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 }
    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
    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) {
     
        }
    }
    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.

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

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

    Merci beaucoup à ceux qui pourraient m'aider

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 875
    Points : 1 313
    Points
    1 313
    Par défaut
    tu te perds.
    Soit tu fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    services:
        site.service_test:
            class: Site\TestBundle\Test\ServiceTest
            arguments: [@doctrine.orm.entity_manager]
    puis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public function __construct($em) {
            $this->em = $em; 
        }
    soit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    services:
        site.service_test:
            class: Site\TestBundle\Test\ServiceTest
            arguments: [@doctrine]
    puis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public function __construct($doctrine) {
            $this->em = $doctrine->getManager(); 
        }

    D'ailleurs l'erreur est très claire, il essaye de faire un getDoctrine sur un objet de type entity manager

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Décembre 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Décembre 2011
    Messages : 5
    Points : 6
    Points
    6
    Par défaut
    Oula !

    Au temps pour moi, à force de galérer je me suis un peu perdu (à la base j'envoyais un contrôleur en paramètre, et je tentais getDoctrine(), ce qui ne marche évidemment pas pour un EntityManager...)

    Bref je vais prendre un peu de recul avant de poster des bêtises, merci pour ton aide gototog

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2007] erreur impossible d'utiliser la fonction dans cette expression
    Par tibofo dans le forum VBA Access
    Réponses: 2
    Dernier message: 05/06/2010, 09h27
  2. Impossible d'utiliser V$SQL dans un Trigger
    Par titan_33 dans le forum SQL
    Réponses: 6
    Dernier message: 25/02/2010, 16h39
  3. impossible d'utiliser LIMIT 1 dans une sous-requête
    Par Christophe Charron dans le forum Requêtes
    Réponses: 13
    Dernier message: 19/12/2009, 22h42
  4. DAO impossible d'utiliser une fonction dans un requete
    Par exter666 dans le forum VBA Access
    Réponses: 10
    Dernier message: 24/09/2005, 17h15
  5. impossible d'utiliser ma fonction dans un insert
    Par caramel dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 10/04/2003, 15h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo