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 avoir accès à l'utilisateur courant ainsi qu'à ses données en session n'importe où depuis mon appli [2.x]


Sujet :

Symfony PHP

  1. #1
    Membre averti

    Inscrit en
    Juin 2008
    Messages
    307
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 307
    Points : 364
    Points
    364
    Par défaut Comment avoir accès à l'utilisateur courant ainsi qu'à ses données en session n'importe où depuis mon appli
    il y a 2 ans j'avais travaillé sur un projet symfony, et si ma mémoire est bonne, on pouvait accéder à l'utilisateur courant ainsi qu'à ses données stockées en session, de n'importe ou depuis l'appli (pour les requêtes notamment).


    J'ai l'impression qu'il n'y a pas cette fonctionnalité la dans Sf2, et que l'on ne peut accéder aux données de l'utilisateur(session) uniquement dans un contrôleur.Du coup, quand je fais appel à des requêtes dans mes repository, je transmet l'utilisateur et la session (car mes requêtes sont paramétrées suivant le rôle de l'utilisateur ainsi que diverses données stockées en session. Idem pour mes formulaire qui vont êtres configurés différemment suivant le rôle de l'utilisateur

    je trouve pas ca super propre et assez lourd, du coup je voulais avoir l'avis de ceux qui ont une connaissance avancée du framework pour savoir s'il y avait une meilleure façon de faire.

    D'avance merci pour votre aide.

  2. #2
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Sans aucune connaissance de SF2, on peut image jouer avec session_set_save_handler afin de faire partir les données de session en base plutôt que sur fichier. De cette façon, tu peux les récupérer de n'importe où.

  3. #3
    Membre averti

    Inscrit en
    Juin 2008
    Messages
    307
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 307
    Points : 364
    Points
    364
    Par défaut
    C'est que je veux éviter de faire. Je souhaite garder une certaine cohérence en utilisant les objets du framework.
    D'ailleurs ce problème se pose aussi pour les paramètres définis dans le parameter.ini. Il ne sont accessible que dans le controlleur ce qui de mon point de vu est assez limité...

    Edit : après de multiples recherches, la réponse qui pourrait convenir serait de passer l'objet session et user lors de l'instanciation du service Doctrine. Par contre je vois pas du tout ou c'est configuré.

  4. #4
    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,

    sur les dernière version de Doctrine, il y a un système de filtre sql :
    http://docs.doctrine-project.org/en/...e/filters.html
    Je n'ai pas testé son intégration dans Symfony 2.1


    En attendant, sur un problème similaire, j'ai adopté cette stratégie:
    1. créer une classe entityManager personalisé avec un attribut currentUser,
      on l'enregistre en mettant dans config.yml
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      parameters:
         doctrine.orm.entity_manager.class: Ma/Classe/Qui/Herite/De/EntityManager
    2. créer un service Listener sur l'evenement onController par exemple, celui-ci se charge d'injecter le user dans l'entityManager
    3. dans les repository, on a désormais accés au user par le biais de
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      $this->getEntityManager()->getCurrentUser()


    ici j'injecte le user, mais on pourrait injecter n'importe quel service.
    Noter que l'on n'injecte pas le service à l'instanciation de l'entityManager, mais lorsque l'on arrive sur le controlleur.
    Il faut toujours tester si on a un currentUser avant de l'utiliser comme critère (exemple de l'appel d'une requete par ligne de commande, ou il n'y a pas de user connecté)

  5. #5
    Membre averti

    Inscrit en
    Juin 2008
    Messages
    307
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 307
    Points : 364
    Points
    364
    Par défaut
    As tu un exemple complet de code, ça fait 2 heures que je m'escrime a faire marcher mais il me prend toujours la classe de base pour l'entityManager. J'ai l'impression qu'il ne me prend pas en compte cette ligne la
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    parameters:
      doctrine.orm.entity_manager.class: Experian\FactumailBundle\Doctrine\MyEntityManager
    qui indique qu'il faut utiliser cette classe la pour mon entitymanager.

  6. #6
    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 faut redéfinir la méthod statique "create", afin qu'elle renvoit une instance de ton propre entity manager
    voir http://stackoverflow.com/questions/8...lass-in-symfon

  7. #7
    Membre averti

    Inscrit en
    Juin 2008
    Messages
    307
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 307
    Points : 364
    Points
    364
    Par défaut
    C'est good ca marche. J'avais effectivement ca comme problème et j'avais oublié d'importer le config.yml de mon bundle.

    Voici le récap de ce que j'ai fait pour ce que ça intéresse :

    *ajout de la ligne suivant dans le config.yml de mon app/Resources

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    - { resource: "@AcmeMonBundle/Resources/config/config.yml"}
    *il faut bien sur créer le config.yml dans votre bundle avec les lignes suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    parameters:
      doctrine.orm.entity_manager.class: Acme\MonBundle\Doctrine\MyEntityManager
    Nota : Les deux étapes précédentes ne sont pas obligatoires, vous pouvez tout mettre dans le premier confi.yml

    *Ensuite création de la classe MyEntityManager qui hérite de EntityManager dans le dossier Doctrine de mon Bundle. Il suffit de rajouter les nouveaux attributs a prendre en compte (avec leur getter et setter) et y ajouter la méthode statique create() comme indiqué dans le poste précédent.


    *Il faut ensuite définir le listener dans votre fichier services.yml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    services:
      doctrine_listener:
        class: Acme\MonBundle\Listener\DoctrineListener
        arguments : [@session, @doctrine.orm.entity_manager]
        tags:
          - { name: kernel.event_listener, event: kernel.controller, method: onKernelController}
    au niveau des argument ajoutez ce que vous souhaitez utiliser dans votre entityManager.

    *Et finalement il ne reste plus qu'à créer votre 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
    <?php
     
    namespace Acme\MonBundle\Listener;
     
    use Symfony\Component\EventDispatcher\Event;
    use Symfony\Component\Security\Core\SecurityContext;
    use Symfony\Bundle\DoctrineBundle\Registry as Doctrine;
    use Symfony\Component\HttpFoundation\Session;
    use Doctrine\ORM\EntityManager;
     
    /**
     * listener.
     */
    class DoctrineListener {
     
      protected $session;
     
      protected $em;
     
      public function __construct(Session $session,  EntityManager $entityManager) {
        $this->session = $session;
        $this->em = $entityManager;
      }
     
      /**
       * @param Event $event
       */
      public function onKernelController($event) {
     
        $this->em->setSession($this->session);
      }
    }
    je sais pas si c'est le plus optimisé, mais dans tous les cas ca marche

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/06/2008, 11h38
  2. Comment avoir accès à "Ses messages"
    Par idamarco dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 2
    Dernier message: 23/09/2007, 13h39
  3. Réponses: 17
    Dernier message: 15/04/2007, 12h28
  4. Réponses: 2
    Dernier message: 22/02/2007, 14h21
  5. [C++ 1.1] Comment avoir accès aux méthodes d'une dll ?
    Par jacklsurf dans le forum Framework .NET
    Réponses: 6
    Dernier message: 15/04/2006, 22h49

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