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 :

Comment récupérer des paramètres ailleurs que dans les contrôleurs ? [2.x]


Sujet :

Symfony PHP

  1. #1
    Membre éclairé

    Inscrit en
    Novembre 2008
    Messages
    418
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 418
    Points : 829
    Points
    829
    Par défaut Comment récupérer des paramètres ailleurs que dans les contrôleurs ?
    Bonjour,
    Si je place des paramètres dans un fichier yml (dans Bundle/Resources/config).
    Pour récupérer un paramètre dans le contrôleur, je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        $ma_variable = $this->container->getParameter('mon.parametre');
    Par contre, si je veux récupérer ce paramètre ailleurs que dans le contrôleur... Je n'ai pas de $this->container...
    Comment fait-on ?
    En l’occurrence, j'essaie de récupérer un paramètre dans un Token personnalisé.

    Merci pour votre aide

  2. #2
    Membre éclairé

    Inscrit en
    Novembre 2008
    Messages
    418
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 418
    Points : 829
    Points
    829
    Par défaut
    J'ai trouvé un moyen : l'injection de @service_container. Mais ce n'est pas complètement satisfaisant...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        accessmaster.security.authentication.listener:
            class:  Acme\SecurityBundle\Security\Authentication\Firewall\AccessMasterAuthenticationListener
            arguments: [@service_container, @security.context, @security.authentication.manager, @security.authentication.session_strategy, @security.http_utils]
    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
     
    class AccessMasterAuthenticationListener extends AbstractAuthenticationListener
    {
        protected $securityContext;
        protected $authenticationManager;
        protected $httpUtils;
        protected $container;
     
        public function __construct($container, SecurityContextInterface $securityContext, AuthenticationManagerInterface $authenticationManager,
                                    SessionAuthenticationStrategyInterface $sessionStrategy, HttpUtils $httpUtils, $options = array())
        {
             parent::__construct($securityContext, $authenticationManager, $sessionStrategy, $httpUtils, "accessmaster", array_merge(array(
                'username_parameter' => '_username',
                'password_parameter' => '_password',
                'intention' => 'authenticate',
                'post_only' => true,
            ), $options));
            $this->container = $container;
     
        }
    Le soucis, c'est que cela se passe bien si j'ai besoin de ces paramètres dans un service mais cela se complique lorsque je veux avoir accès à ces paramètres à partir d'un objet instancié dans un de ces services... Il faut alors que je passe le container au constructeur de la classe en question...

    Imaginons un service S qui n'a pas besoin du container mais qui instancie un objet O qui, lui, nécessite un paramétrage. Faut-il injecter le container dans S pour qu'il puisse le passer à O ou existe-t-il une façon de faire à la sauce Symfony qui soit un peu moins lourde...

    Question subsidiaire : Y a-t-il des moyens plus subtils pour gérer le paramétrage que de passer le service_container un peu partout...

    Merci pour vos éclairages.

  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
    Y a-t-il des moyens plus subtils pour gérer le paramétrage que de passer le service_container un peu partout...
    Normalement ce n'est pas le container que tu dois passer dans ton service, mais uniquement les paramétres utiles à celui-ci.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    accessmaster.security.authentication.listener:
            class:  Acme\SecurityBundle\Security\Authentication\Firewall\AccessMasterAuthenticationListener
            arguments: [%id.de.mon.parametre.dans.le.service_container%, @security.context, @security.authentication.manager, @security.authentication.session_strategy, @security.http_utils]
    et effectivement si ton service a pour vocation d'instancier des objets en fonction de ce paramètre, il est logique d'injecter ce parametre dans ton service.

  4. #4
    Membre éclairé

    Inscrit en
    Novembre 2008
    Messages
    418
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 418
    Points : 829
    Points
    829
    Par défaut
    Merci
    Je vois que j'avais pratiquement la réponse sous les yeux mais que, le nez trop près du guidon, je ne l'avais pas vue. En tout cas, c'est beaucoup mieux que le passage du container.

    Reste que je m'interroge tout de même.
    Ici, on ne peut pas considérer que l'instanciation des objets soit la "vocation" du service.

    Je précise le contexte :
    Lorsque je mets en place un système personnalisé de sécurité, j'ai
    Un AuthenticationProvider (service)
    Un AuthenticationListener (service)
    Ces deux services instancient l'objet "Token".

    Ce Token nécessite un paramétrage qui lui est propre.

    Dans ce cas, cela signifie que je vais devoir passer le paramètre en question à l'AP et à l'AL (ainsi qu'à tous les objets et services susceptibles d'instancier cet objet - dans le cas présent, c'est peu probable) alors même que ces deux services n'en ont pas vraiment besoin, et que ce paramètre ne dépend de rien d'autre.

    Cela signifie également que si je change d'implémentation pour le token et que je n'ai plus besoin de ce paramètre, je vais devoir modifier le paramétrage des services alors qu'ils ne sont normalement pas concernés.

    Cela ne me semble pas terrible.

    Mais bon, je capilloquadrisectionne un peu. Merci encore pour ta réponse.

  5. #5
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cela signifie également que si je change d'implémentation pour le token et que je n'ai plus besoin de ce paramètre, je vais devoir modifier le paramétrage des services alors qu'ils ne sont normalement pas concernés.
    Plutôt que de passer ce paramètre dans le constructeur tu peux aussi le passer via un setter, ça évite de modifier sans cesse l'ordre des arguments.

  6. #6
    Membre éclairé

    Inscrit en
    Novembre 2008
    Messages
    418
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 418
    Points : 829
    Points
    829
    Par défaut
    Merci pour ces précisions...

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 06/07/2015, 21h02
  2. [2.x] Mapping automatique des paramètres d'actions dans les controleurs
    Par Dimitri69 dans le forum Symfony
    Réponses: 5
    Dernier message: 20/02/2012, 16h32
  3. Comment récupérer des paramètre de l'url ?
    Par link256 dans le forum GWT et Vaadin
    Réponses: 6
    Dernier message: 20/07/2010, 16h44
  4. Réponses: 0
    Dernier message: 10/08/2008, 19h05
  5. Réponses: 4
    Dernier message: 29/03/2007, 10h10

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