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 :

fonctionnement du CommentManager dans FOSCommentBundle [2.x]


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2011
    Messages : 28
    Par défaut fonctionnement du CommentManager dans FOSCommentBundle
    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;
        }
    ?

  2. #2
    Membre éclairé
    Homme Profil pro
    Freelance
    Inscrit en
    Décembre 2003
    Messages
    423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Freelance

    Informations forums :
    Inscription : Décembre 2003
    Messages : 423
    Par défaut


    Je ne connais pas le FOSCommentBundle en particulier, mais en fait il faut savoir que le but de ce genre de Bundle c'est d'être le plus générique possible et de pouvoir d'adapter à "n'importe quel projet". De ce fait il y a normalement toute une couche de configuration.
    Tu dois avoir notamment des fichiers xml qui définisse des valeurs par défaut pour tous tes éléments ... configuration que tu peux naturellement modifier via ton fichier de config en surchargeant le bloc "fos_comment" j'imagine.
    Ensuite c'est l'injecteur de dépendance qui fait tout le boulot pour toi. Au moment où tu fais appels à la méthode $this->container->get('fos_comment.creator.coment') 'fos_comment.creator.comment' est un service. Dans les différents fichiers de configuration il est défini quels paramètres sont attendus pour sa création.
    Fais une recherche dans le dossier de FOSCommentBundle de la chaîne 'fos_coment.coment.manager' (à priori dans les fichiers xml / yml) ...

    Jète également un oeil à "Resources/doc/index.rst" du Bundle, tu devrais y trouver des infos : https://github.com/FriendsOfSymfony/.../doc/index.rst

    Mais sinon je t'invite à te rendre sur la documentation et voir tout ce qui est "Service" et Configuration.

    Faut reconnaître qu'au premier abord (et surtout le manque de documentation) ce n'est pas très évident (je suis un peu dans la même galère que toi ... mais avec le FOSUserBundle).


    Bonne soirée

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2009
    Messages
    383
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 383
    Par défaut
    Comme le dit Bleys, c'est un service.
    Le service a trois paramètres.
    Pour avoir acces a ces trois paramètres dans les différentes fonctions de la classe (du service), ils stockent ceux-ci dans une variable protégée.

    Donc en fait: (ou n importe quel service d'ailleurs)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    get('fos_comment.creator.comment')
    Cette partie la recupere le service. Lors de la creation du service (la premiere fois), il a recu en entree les differentes choses et les a stocké dans des variables protégées.

    Comment sait on d ou viennent les parametres?
    Simple, cela vient des fichiers de config : exemple .
    Dans celui la, on voit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <service id="fos_comment.creator.comment.default" class="FOS\CommentBundle\Creator\DefaultCommentCreator" public="false" scope="request">
                <argument type="service" id="fos_comment.manager.comment" />
                <argument type="service" id="fos_comment.blamer.comment" />
                <argument type="service" id="fos_comment.spam_detection.comment" />
            </service>
    Donc, si on traduit, le service "fos_comment.creator.comment.default" prend en parametres trois autres services : "fos_comment.manager.comment", "fos_comment.blamer.comment" et "fos_comment.spam_detection.comment".
    Ces trois autres services sont definis egalement de cette maniere.

    D'ou vient l'entity manager de doctrine?

    simple. si tu regardes la config du service "manager" pour orm , tu remarqueras que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     <service id="fos_comment.manager.comment.default" class="%fos_comment.manager.comment.default.class%">
                <argument type="service" id="doctrine.orm.entity_manager" />
                <argument>%fos_comment.model.comment.class%</argument>
                <argument type="service" id="fos_comment.sorting_factory" />
            </service>
    Ce service la prend en parametre le service "doctrine.orm.entity_manager". Bingo! En fait, ce service provient du bundle DoctrineBundle.

    Une derniere chose. Tu dois te demander comment le bundle charge ces fichiers qui definissent les services.
    En fait, c'est ce qui s appelle l injection de dependances et c est définit ici.
    C'est ce fichier qui est appelé en premier et qui va charger les fichiers de configuration des services qu il a besoin.

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2011
    Messages : 28
    Par défaut
    Merci à vous deux pour votre aide précieuse.

    Citation Envoyé par RapotOR Voir le message
    Une derniere chose. Tu dois te demander comment le bundle charge ces fichiers qui definissent les services.
    En fait, c'est ce qui s appelle l injection de dependances et c est définit ici.
    C'est ce fichier qui est appelé en premier et qui va charger les fichiers de configuration des services qu il a besoin.
    J'avais étudié les fichiers xml et yaml dans Ressource/config/ Je crois que ce qu'il me manquait c'était l'injection de dépendance. Il faut que j'étudie ça d'un peu plus près pour vraiment le comprendre. Donc à première vue c'est l'injection de dépendance qui s'occupe de faire passer les bons paramètres dans les constructeurs...

    Jeudi symfony 2 arrive en version finale. J'espère qu'on aura bientôt droit à un livre qui va un peu plus loin que la documentation du site web, bien que celle ci soit déjà relativement riche.

    EDIT Autant pour moi : http://components.symfony-project.org/ et aussi un bon article : http://www.elao.org/symfony-2/symfon...pendances.html

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

Discussions similaires

  1. Comment fonctionne l'authentification dans RIA Services
    Par chris81 dans le forum Silverlight
    Réponses: 6
    Dernier message: 06/01/2010, 00h19
  2. Comment faire fonctionner ce script dans mon site ?
    Par beegees dans le forum jQuery
    Réponses: 4
    Dernier message: 02/01/2010, 23h01
  3. Fonctionnement des Treview dans les userform
    Par popsmelove dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 21/01/2008, 13h12
  4. Réponses: 10
    Dernier message: 16/05/2007, 17h47

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