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 :

Personnaliser la récupération de l'utilisateur


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2007
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2007
    Messages : 186
    Par défaut Personnaliser la récupération de l'utilisateur
    Bonjour,

    J'utiliser actuellement le Bundle FOSUser et récupère mon utilisateur ainsi (au sein de mon controller):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->container->get('security.context')->getToken()->getUser();
    J'aimerais pouvoir personnaliser la requête DQL qui récupère les données de l'utilisateur. De façon a récupérer plus de données et éviter une/des nouvelles requêtes.

    Savez-vous de quelle manière je peux m'y prendre ?
    Merci beaucoup !

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    772
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2004
    Messages : 772
    Par défaut
    Dans un premier temps, est-ce que ton entité User (si elle s'appelle bien comme ça) a des associations avec d'autres entités ? Si oui, il doit y avoir un getter sur ton entité User qui te permet d'y accéder.

  3. #3
    Membre confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2007
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2007
    Messages : 186
    Par défaut
    Bonjour,

    Mon entité User hérite de l'entité User de FOSUser:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    use FOS\UserBundle\Entity\User as BaseUser;
     
    class User extends BaseUser
    {
    Elle a bien des relations avec d'autres entités et j'ai bien des getters pour y accéder. Cependant, lorsque je récupère mon entité comme vu ci-dessus, je ne sais pas comment modifier la requête DQL de façon a récupérer les données de ces relations.

    La requete généré par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->container->get('security.context')->getToken()->getUser();
    est

    SELECT t0.username AS username1, t0.username_canonical AS username_canonical2, t0.email AS email3, t0.email_canonical AS email_canonical4, t0.enabled AS enabled5, t0.algorithm AS algorithm6, t0.salt AS salt7, t0.password AS password8, t0.last_login AS last_login9, t0.locked AS locked10, t0.expired AS expired11, t0.expires_at AS expires_at12, t0.confirmation_token AS confirmation_token13, t0.password_requested_at AS password_requested_at14, t0.roles AS roles15, t0.credentials_expired AS credentials_expired16, t0.credentials_expire_at AS credentials_expire_at17, t0.id AS id18 FROM m_user t0 WHERE t0.username_canonical = ?
    et en clair j'aimerais pouvoir la personnaliser et récupérer par exemple les "messages" ou autres.

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    772
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2004
    Messages : 772
    Par défaut
    Il faut que tu écrives ton propre EntityUserProvider. Celui-ci doit étendre l'interface UserProviderInterface.

    Cette interface t'impose d'écrire une fonction loadUserByUsername. Dans cette fonction, tu n'utiliseras pas le Repository habituel de l'EntityManager mais un UserRepository que tu auras écrit toi-même.

    Exemple à adapter :
    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
    33
    34
    35
    36
    37
    38
    39
     
     
       /**
        * Constructeur du service security.user.provider.entity
        * @param EntityManager       $em
        * @param string              $class Entité qui sert de user de connexion
        * @param string              $property Nom du champ qui sert de login sur l'entité $class
        */
       public function __construct(EntityManager $em, $class, $property = null)
       {
          $this->class = $class;
     
          if (false !== strpos($this->class, ':'))
          {
             $this->class = $em->getClassMetadata($class)->name;
          }
     
          //$this->repository = $em->getRepository($class);
          $this->repository = new UserRepository($em, $em->getClassMetadata($class));
     
          $this->property = $property;
       }
     
      /**
        * Charge un user à partir de son username
        * @param string $username
        * @return UserInterface
        */
       public function loadUserByUsername($username)
       {
       $user = $this->repository->findOneByMyWay($username);
     
          if (null === $user)
          {
             throw new UsernameNotFoundException(sprintf('User "%s" not found.', $username));
          }
     
          return $user;
       }
    Dans cette fonction, tu n'utiliseras pas le Repository habituel de l'EntityManager mais un UserRepository que tu auras écrit toi-même.

    Exemple à adapter :
    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
    33
    /**
     * Repository spécifique aux User sellermania (jointure au chargement)
     * @package    SellerPhp.SellerBundle
     * @subpackage Repository
     */
    class UserRepository extends EntityRepository
    {
     
       /**
        * Retourne un objet User à partir de son email
        * @param string $email
        * @return User
        */
       public function findOneByMyWay($email)
       {
          $query = 'SELECT u, t1, t2 FROM XxxYourBundle:User u
                JOIN u.table1 t1
                JOIN t1.table2 t2
                WHERE u.email = :email';
     
          $queryBuilder = $this->getEntityManager()->createQuery($query)->setParameter('email', $email);
     
          try
          {
             return $queryBuilder->getSingleResult();
          }
          catch (\Doctrine\ORM\NoResultException $e)
          {
             return null;
          }
       }
     
    }
    Voilà la trame... Tu viens de me donner une idée de post pour mon blog, merci

  5. #5
    Membre confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2007
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2007
    Messages : 186
    Par défaut
    Merci beaucoup pour ton aide =)
    Il me reste cependant deux petites questions:

    * J'imagine que c'est dans le fichier de configuration security, mais comment préciser à symfony d'utiliser mon EntityUserProvider?

    * J'aimerais pouvoir également passer des paramètres a getUser() sur cette ligne (pour adapter les dépendance a récupérer en base en fait):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->container->get('security.context')->getToken()->getUser();
    est-ce aussi possible ?

  6. #6
    Membre émérite

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    772
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2004
    Messages : 772
    Par défaut
    1- Xxx/YourBundle/Resources/config/services.yml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    parameters:
     
        security.user.provider.entity.class: Xxx\YourBundle\xyxyxyxyx\Security\Core\User\EntityUserProvider
     
    services:
     
        security.user.provider.entity:
            class: %security.user.provider.entity.class%
            abstract: true
            public: false
            arguments: ['@security.user.entity_manager']
    2- C'est possible... Il faut développer ton propre Token ou surcharger celui de Symfony et ré-écrire la méthode getUser()... Sur le même modèle que pour l'EntityUserProvider.

Discussions similaires

  1. Récupération de l'utilisateur connecté
    Par JauB dans le forum AS/400
    Réponses: 9
    Dernier message: 19/03/2008, 10h07
  2. Réponses: 3
    Dernier message: 19/10/2007, 15h32
  3. Pb Récupération de l'utilisateur
    Par Lolie11 dans le forum SQL Procédural
    Réponses: 11
    Dernier message: 23/05/2007, 15h13
  4. Récupération des droits utilisateur
    Par albanhig dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 18/05/2007, 18h10
  5. récupération de l'utilisateur du poste
    Par guitoo dans le forum ASP.NET
    Réponses: 6
    Dernier message: 28/02/2007, 16h29

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