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 :

Appeler un service depuis un autre [2.x]


Sujet :

Symfony PHP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 96
    Points : 72
    Points
    72
    Par défaut Appeler un service depuis un autre
    Bonjour,

    J'ai créée un service/extension TWIG.
    Dans ce service j'ai besoin dans une méthode d'appeler un autre service :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public function twigGetUserRole()
    {
            $user = $this->container->get('security.context')->getToken()->getUser();
            $roles = $user->getRoles();
     
            return $roles[0];
    }
    Mon problème est que le conteneur de service n'est pas accessible depuis mon service et j'obtiens cette erreur :
    An exception has been thrown during the rendering of a template ("Notice: Undefined property: ......... $container.....
    J'imagine que ça doit être possible ?

    Merci

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 96
    Points : 72
    Points
    72
    Par défaut
    Pour info j'ai trouvé une solution même si je n'ai pas la réponse à ma question 'Comment appeler un service à partir d'un autre ?'
    D'après le code vous aurez surement compris que je voulais récupérer dans un twig le role du 'user' connecté.

    Dans votre vue il suffit d'utiliser ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    {{ app.user.getRoles() }}
    Evidemment il faut avoir une entité user qui implémente l'interface 'UserInterface'.

    Je suis tout de même preneur si vous avez la réponse à ma fameuse question

  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
    Il suffit de configurer le container pour qu'il s'injecte dans ta classe d'extension doctrine
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    //My/Bundle/Twig/Extension.php
     
    protected $container;
     
    public function setContainer($container) {
    	$this->container = $container;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    //My/Bundle/config/services.xml
    <service id="my.twig_ext" class="My/Bundle/Twig/Extension" public="false">			
          <argument type="service" id="twig.loader" />
          <call method="setContainer">
            <argument type="service" id="service_container" />
          </call>  
          <tag name="twig.extension" />
        </service>
    Une méthode plus rigoureuse est d'injecter uniquement les services dont tu as besoin plutôt que le container.


    Un utilisateur peut avoir aucun ou plusieurs roles, donc le code de ton extension est susceptible de poser problème (il renvoit le premier role trouvé, et l'utilisateur peut n'avoir aucun role).
    on utilise plutôt la fonction is_granted pour gérer les roles:
    http://symfony.com/doc/current/book/...l-in-templates

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 96
    Points : 72
    Points
    72
    Par défaut
    Merci pour ces précisions

  5. #5
    Membre éclairé
    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
    Points : 658
    Points
    658
    Par défaut
    Je rajouterais 2 commentaires:

    - Tu peux le faire dans le __construct directement plutot que d'appeler une autre fonction.

    - Si tu n'as besoin que d'un seul service, ce n'est pas la peine d'envoyer le container entier! Il vaut mieux envoyer le service en question.

    Exemple de la doc (je le montre en xml):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <!-- app/config/config.xml -->
    <services>
        <service id="my_mailer" ... >
          <!-- ... -->
        </service>
        <service id="newsletter_manager" class="%newsletter_manager.class%">
            <argument type="service" id="my_mailer"/>
        </service>
    </services>
    http://symfony.com/doc/current/book/...cting-services

    Dans l'exemple; tu remarques que l'argument du service "newsletter_manager" est le nom d'un service existant (my_mailer).
    Un petit si la réponse convient. Merci.

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

Discussions similaires

  1. [PHP 5.2] appeler une fonction depuis une autre en POO
    Par Haxor668 dans le forum Langage
    Réponses: 2
    Dernier message: 23/09/2009, 10h02
  2. Réponses: 2
    Dernier message: 10/04/2009, 15h03
  3. Appeller une fonction depuis un autre site
    Par ProgVal dans le forum Langage
    Réponses: 3
    Dernier message: 03/12/2008, 18h01
  4. Appeler un RJS depuis un autre RJS ?
    Par titoumimi dans le forum Ruby on Rails
    Réponses: 5
    Dernier message: 24/05/2007, 19h26
  5. Réponses: 2
    Dernier message: 25/08/2006, 21h53

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