Bonjour,

Voilà mon problème du jour. J'étais en train d'étudier FOSCommentBundle quand je suis tombé sur ce petit bout de code que je ne comprend pas. Dans le fichier FOS/CommentBundle/Entity/CommentManager.php J'ai de la peine à comprendre le constructeur:
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
 
    /**
     * Constructor.
     *
     * @param EntityManager           $em
     * @param string                  $class
     * @param SortingFactory          $factory
     */
    public function __construct(EntityManager $em, $class, SortingFactory $factory)
    {
        $this->em              = $em;
        $this->repository      = $em->getRepository($class);
        $this->class           = $em->getClassMetadata($class)->name;
 
        $this->setSortingFactory($factory);
    }
Il est utilisé dans le controller CommentController dans l'action createAction à cet endroit du code:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
 
        if ('POST' == $request->getMethod()) {
            $form->bindRequest($request);
 
            if ($form->isValid() && $this->container->get('fos_comment.creator.comment')->create($comment)) {
                return $this->onCreateSuccess($form);
            }
        }
 
        return $this->onCreateError($form);
    }
La ligne
Code : Sélectionner tout - Visualiser dans une fenêtre à part
get('fos_comment.creator.comment')->create($comment)
fait appel à la méthode create de la classe FOS\CommentBundle\Creator\DefaultCommentCreator
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
    /**
     * {@inheritDoc}
     */
    public function create(CommentInterface $comment)
    {
        $this->commentBlamer->blame($comment);
 
        if ($this->spamDetection->isSpam($comment)) {
            return false;
        }
 
        $this->commentManager->addComment($comment);
 
        return true;
    }
qui fait ensuite appel à la méthode addComment de la classe CommentManager.

En fait ce que je ne comprend pas comment l' entity Manager $em créé par le contructeur de CommentManager.php est équivalent à la ligne suivante:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
$em = $this->getDoctrine()->getEntityManager();
Je ne comprend pas à quel moment le contructeur est appelé et quels arguments lui sont passés.

edit: En fait je me rend compte que c'est aussi ambigu pour moi au moment ou la méthode create de la classe FOS\CommentBundle\Creator\DefaultCommentCreator est appelée. A ce moment là une instance de cette classe est créée mais quels arguments sont passés dans son constructeur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
    /**
     * Constructor.
     *
     * @param CommentManagerInterface $commentManager
     * @param CommentBlamerInterface $commentBlamer
     * @param SpamDetectionInterface $spamDetection
     */
    public function __construct(CommentManagerInterface $commentManager, CommentBlamerInterface $commentBlamer, SpamDetectionInterface $spamDetection)
    {
        $this->commentManager = $commentManager;
        $this->commentBlamer  = $commentBlamer;
        $this->spamDetection  = $spamDetection;
    }
?