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 :

circular reference detected for service "doctrine.dbal.default_connection" [2.x]


Sujet :

Symfony PHP

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2014
    Messages : 4
    Points : 5
    Points
    5
    Par défaut circular reference detected for service "doctrine.dbal.default_connection"
    Hello,

    Je code un ptit bundle de commentaire, et j'ai un listener qui doit "écouter" lorsque l'on supprime un article, et qui supprime donc les commentaires liés à l'article.

    j'ai une classe "CommentManager" (qui possède plusieurs méthodes dont celle pour supprimer les commentaires) que j'ai rendu disponible en tant que Service.

    Mon listener a besoin de récupérer la classe CommentManager pour pouvoir supprimer les commentaires. Mais lorsque j'injecte mon CommentManager dans mon listener Symfony me balance une exception "Circular reference detected for service "doctrine.dbal.default_connection", path: "doctrine.dbal.default_connection". "

    Je peux éviter cette exception en injectant le Service Container directement dans mon service, mais l'inspecteur de SensioLab me dis que le Container ne doit pas être passé en argument.

    Donc j'aimerai savoir ce qui provoque cette erreure car la je bloque vraiment.


    service.yml:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    comment.manager:
            class: MonProjet\CommentBundle\Manager\CommentManager
            arguments: [@doctrine.orm.entity_manager, @form.factory, @router, @security.context, @session, @mon.comment.form, %mon_comment.comment.class%,"@=container.hasParameter('fos_user.model.user.class') ? parameter('fos_user.model.user.class') : null"]
     
     
    comment.listener:
            class: MonProjet\CommentBundle\Listener\CommentListener
            arguments: ['@comment.manager']
            tags:
                - { name: doctrine.event_listener, event: preRemove, method: preRemove }

    CommentListener:
    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
    37
    38
    39
    40
    41
    42
     
    <?php
     
    namespace MonProjet\CommentBundle\Listener;
     
    use Doctrine\ORM\Event\LifecycleEventArgs;
    use MonProjet\CommentBundle\Interfaces\CommentableInterface;
    use Symfony\Component\DependencyInjection\ContainerInterface;
    use Doctrine\ORM\Events;
    use MonProjet\CommentBundle\Manager\CommentManager;
     
    class CommentListener{
     
     
        public $manager;
     
     
        public function __construct(CommentManager $manager)
        {
            $this->manager = $manager;
        }
     
     
        public function preRemove(LifecycleEventArgs $args)
        {
            $model = $args->getEntity();
     
            if($model instanceof CommentableInterface)
            {
                $this->manager->preDeleteComment($model);
            }
        }
     
     
        public function getSubscribedEvents()
        {
            return [
                Events::preRemove
            ];
        }
     
    }
    Merci d'avance pour votre aide.

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    Quelle version du framework tu utilises? Ce problème semble avoir été résolu lors du passage à 2.3.

    Issue sur Github
    Le commit du bugfix.

    Pour confirmer que c'est le même problème, fais un cache clear, puis cherche le fichier DevDebugProjectContainer.php dans le cache. Regarde la méthode getDoctrine_Dbal_DefaultConnectionService et vérifie s'il y a deux lignes après le return.

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2014
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    salut Tsilefy et merci pour ta réponse.

    alors pour tester mon bundle, j'utilise une version récente de symfony (version 2.6.*).

    j'ai fait un clear cache et il n'y a pas de ligne après le return de la méthode getDoctrine_Dbal_DefaultConnectionService.

    getDoctrine_Dbal_DefaultConnectionService :
    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
     
        protected function getDoctrine_Dbal_DefaultConnectionService()
        {
            $a = new \Doctrine\DBAL\Logging\LoggerChain();
            $a->addLogger(new \Symfony\Bridge\Doctrine\Logger\DbalLogger($this->get('monolog.logger.doctrine', ContainerInterface::NULL_ON_INVALID_REFERENCE), $this->get('debug.stopwatch', ContainerInterface::NULL_ON_INVALID_REFERENCE)));
            $a->addLogger($this->get('doctrine.dbal.logger.profiling.default'));
     
            $b = new \Doctrine\DBAL\Configuration();
            $b->setSQLLogger($a);
     
            $c = new \Symfony\Bridge\Doctrine\ContainerAwareEventManager($this);
            $c->addEventSubscriber(new \FOS\UserBundle\Doctrine\Orm\UserListener($this));
            $c->addEventListener(array(0 => 'preRemove'), $this->get('my.media.listener'));
            $c->addEventListener(array(0 => 'preRemove'), $this->get('my.comment.listener'));
     
            return $this->services['doctrine.dbal.default_connection'] = $this->get('doctrine.dbal.connection_factory')->createConnection(array('driver' => 'pdo_mysql', 'host' => '127.0.0.1', 'port' => NULL, 'dbname' => 'app', 'user' => 'root', 'password' => 'root', 'charset' => 'UTF8', 'driverOptions' => array()), $b, $c, array());
        }
    Est-ce normal ou c'est de là que viens le problème ?

    Merci.

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    Ça semble normal.

    Essaie d'injecter le manager dans une setter plutôt que dans le constructeur. Ce n'est pas exactement une bonne pratique puisque ta dépendence est obligatoire, mais bon.

    Par contre, si ça marche, il faudra ajouter une clause de vérification dans preRemove() afin de vérifier que $this->manager est bien une instance de CommentManager.

  5. #5
    Futur Membre du Club
    Femme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2014
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    J'ai finalement résolu mon soucis en faisant un peu de refractoring sur mon code histoire de rendre certaines Class moins dépendantes des autres.

    Merci pour ton aide Tsilefy.

  6. #6
    Membre averti
    Avatar de phpiste
    Homme Profil pro
    Développeur Senior
    Inscrit en
    Septembre 2006
    Messages
    251
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Senior
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2006
    Messages : 251
    Points : 445
    Points
    445
    Billets dans le blog
    7
    Par défaut
    Citation Envoyé par delphine01 Voir le message
    J'ai finalement résolu mon soucis en faisant un peu de refractoring sur mon code histoire de rendre certaines Class moins dépendantes des autres.

    Merci pour ton aide Tsilefy.
    hi,

    Une explication détaillé de comment t'a résolue ton souci sera le bien bienvenue !

    Ahmed
    Je suis Développeur Senior ouvert aux opportunités
    Mon blog

  7. #7
    Futur Membre du Club
    Femme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2014
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Hello,

    En faite j'ai évité de rendre certaines classes dépendantes de mes propres classes.
    Par exemple mon CommentManager dépendais du service "@doctrine.entity.manager"(et un autre service), et ensuite mon CommentListener dépendais de ma class CommentManager.

    J'ai donc pour ce là retirer la dépendance CommentManager de mon CommentListener, et j'ai injecter dans celui-ci les 2 services de symfony (et non mes propres services) pour initialiser mon CommentManager dans mon action preRemove qui en avait besoin.

    J'ai fais cela pour quelques un de mes services et cela a résolu le problème.

    voila

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 02/09/2013, 15h12
  2. reference ambigue entre services
    Par olibara dans le forum Services Web
    Réponses: 4
    Dernier message: 15/04/2011, 17h38
  3. Réponses: 2
    Dernier message: 06/10/2010, 18h31
  4. [Lazarus] Circular reference
    Par bL0w_waffeE dans le forum Lazarus
    Réponses: 6
    Dernier message: 17/04/2009, 09h26
  5. [1.x] Too many forwards have been detected for this request
    Par rredouane dans le forum Symfony
    Réponses: 1
    Dernier message: 27/02/2008, 10h25

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