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 :

Références circulaires en série


Sujet :

Symfony PHP

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur Front
    Inscrit en
    Décembre 2013
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Front
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2013
    Messages : 59
    Points : 91
    Points
    91
    Par défaut Références circulaires en série
    Salut à tous!

    Voilà, ça fait 24h environ que je me casse la tête à arranger un problème...

    J'ai un doctrine.listener dont le rôle est d'envoyer un mail lors du persist d'une entité, le contenu étant généré par le rendu de Twig. Mais apparemment, ce rendu perturbe l'affichage de la barre de débogage de Symfony... Voici l'erreur:

    Circular reference detected for service "security.context", path: "security.firewall.map.context.main -> security.context -> security.authorization_checker -> security.authentication.manager -> fos_user.user_provider.username -> fos_user.user_manager -> doctrine.orm.default_entity_manager -> doctrine.dbal.default_connection -> gerkindevelopment_home.doctrine.notifications -> templating -> twig".
    Voici le code de mon listener
    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    <?php
    namespace GerkinDevelopment\HomeBundle\DoctrineListener;
     
    use Doctrine\ORM\Event\LifecycleEventArgs;
    use GerkinDevelopment\HomeBundle\Entity\MessageRequest;
    use GerkinDevelopment\HomeBundle\CategoriesGetter\GerkinDevelopmentCategoriesGetter;
    use Symfony\Component\DependencyInjection\ContainerInterface;
    use Doctrine\Bundle\DoctrineBundle\Registry;
    use Symfony\Bundle\TwigBundle\TwigEngine;
     
    class Notifications
    {
      private $cg;
    	private $templating;
    	private $mailer;
    	private $em;
     
      public function __construct(GerkinDevelopmentCategoriesGetter $cg, \Swift_Mailer $mailer, TwigEngine $templating, Registry $em)
      {
    	  $this->cg = $cg;
    	$this->templating = $templating;
    	$this->mailer = $mailer;
    	$this->em = $em;
      }
     
      public function postPersist(LifecycleEventArgs $args)
      {
        $entity = $args->getEntity();
     
        // On veut envoyer un email que pour les entités Application
        if (!($entity instanceof MessageRequest)) {
          return;
        }
     
        $message = \Swift_Message::newInstance()
            ->setSubject($this
    					 ->cg
    					 ->getRequestType($entity->getType())
    					 .": "
    					 .$this
    					 ->cg
    					 ->getRequestCategory($this
    										  ->em
    										  ->getEntityManager('not_default')
    										  , $entity->getType())
    					 .': '
    					 .$entity->getTitle()
    					)
            ->setFrom('address@address.com')
            ->setTo('address@address.com')
            ->setBody(
    		$this
    		  ->templating
    		  ->render('GerkinDevelopmentHomeBundle:mails:newMessageRequest.txt.twig', array('newMessage' => $entity)));
        $this
    		->mailer
    		->send($message);
     
      }
    }
    Et voici le contenu de mon services.yml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    services:
        gerkindevelopment_home.doctrine.notifications:
            class: GerkinDevelopment\HomeBundle\DoctrineListener\Notifications
            arguments: [@gerkindevelopment_home.categoriesgetter, @mailer, @templating, @doctrine]
            tags:
                - { name: doctrine.event_listener, event: postPersist }
     
        gerkindevelopment_home.categoriesgetter:
            class: GerkinDevelopment\HomeBundle\CategoriesGetter\GerkinDevelopmentCategoriesGetter
    J'ai dû faire certaines modifications étranges, comme passer le @doctrine à mon service de notifications, car il dépend de mon CategoriesGetter qui, lui aussi, utilise doctrine... Et ça me faisait tomber dans une belle AUTRE référence circulaire. Bref, je ne m'en sort plus, je sais plus quoi faire....

    Ah et je ne veux pas passer par le ServiceContainer, qui est déprécié d'après SensiolabsInsight.

    Si quelqu'un peut m'aider à éclaircir un peu le problème, je lui serait infiniment reconnaissant.

    Cordialement,

    Nihilivin

  2. #2
    Membre expérimenté Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Points : 1 310
    Points
    1 310
    Par défaut
    Hello,

    Tu as effectivement un gros problème de dépendances (mais pas à la drogue, c'est déjà ça).

    Il y a dans ton erreur un truc qui me turlupine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    doctrine.dbal.default_connection -> gerkindevelopment_home.doctrine.notifications
    Si je ne dis pas de bêtise, je comprends qu'un service doctrine est dépendant d'une de tes libs perso. Comment cela se fait-il ? Ça ne devrait jamais arriver.

    De la même manière je ne comprends pas vraiment cette partie non plus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    security.authentication.manager -> fos_user.user_provider.username
    Le service authentication manager de Symfony ne devrait en aucun cas être dépendant d'un vendor tiers, l'inverse me semble plus logique.

  3. #3
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Points : 1 050
    Points
    1 050
    Par défaut
    Bonjour,

    le tag "doctrine.event_listener" indique qu'à l'instanciation du service doctrine, ton listener doit lui être injecté.
    comme ton listener a lui-même une dépendance vers doctrine, il y a référence circulaire.
    le service security.context est le premier service à faire appel à Doctrine, c'est là que l'exception est levé.

    N'injecte pas l'entity Manager dans ta classe "Notifications", elle n'en as pas besoin comme attribut car l'evenement LifecycleEventArgs permet de récupéer l'entity manager via sa méthode "getEntityManager".

    je ne veux pas passer par le ServiceContainer, qui est déprécié d'après SensiolabsInsight.
    déprécié ou déconseillé ?
    D'ou vient cette affirmation?

  4. #4
    Membre régulier
    Homme Profil pro
    Développeur Front
    Inscrit en
    Décembre 2013
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Front
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2013
    Messages : 59
    Points : 91
    Points
    91
    Par défaut
    Je tire ça direct de chez SensiolabsInsight, dont le validateur considère que passer le service_container est un problème d'architecture...
    The Symfony Dependency Injection Container should not be passed as an argument
    J'ai donc fais les modifs suggérées par arnooo999, et maintenant c'est Twig qui me pose problème... Voyez plutôt:
    Circular reference detected for service "security.context", path: "security.firewall.map.context.main -> security.context -> security.authorization_checker -> security.authentication.manager -> fos_user.user_provider.username -> fos_user.user_manager -> doctrine.orm.default_entity_manager -> doctrine.dbal.default_connection -> gerkindevelopment_home.doctrine.notifications -> templating -> twig"
    J'en étais déjà arrivé à ce stade, mais impossible de trouver une solution pour ce problème ci..

    Merci beaucoup

    Edit:

    Je viens de réaliser que j'avais oublié où j'en étais lorsque j'ai posté ici, vu que j'ai essayé plein de méthodes différentes... En fait, j'ai pas vraiment avancé, le problème reste le même

Discussions similaires

  1. Réponses: 4
    Dernier message: 19/06/2006, 17h02
  2. [SQL 2K5] Pb : ON DELETE CASCADE : référence circulaire
    Par n00bi dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 29/05/2006, 08h48
  3. Référence circulaire
    Par Mvu dans le forum ASP
    Réponses: 3
    Dernier message: 27/04/2006, 14h38
  4. [EXCEL] : référence circulaire à cause d'une macro
    Par repié dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 11/01/2006, 10h41
  5. [DEB] DBdesigner 4 et référence circulaire
    Par Ranbaz dans le forum DBDesigner
    Réponses: 1
    Dernier message: 13/07/2005, 17h32

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