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 :

symfony, User class depuis plusieurs entités


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 23
    Par défaut symfony, User class depuis plusieurs entités
    Bonsoir,

    Je cherche à créer un application dont j'ai modélisé les données ainsi:



    Je créé un fichier security pour gérer le login et mot de passe:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    security:
        providers:
            our_db_provider:
    #            entity: { class: AppBundle\Entity\User, property: username}
                entity: { class: essaiBundle\Entity\Login, property: login}
    Quand j'utilise la classe User, qui est un copié collé de la doc Symfony, évidemment tout fonctionne correctement, mais j'ai du coup tous les champs dans la même table. Ici j'ai la classe user dans une entity, puis une deuxième entity login, en liaison 1-1. Est-ce que dans mon provider je dois utiliser la class login?

    La classe Login ressemble à ça:

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    <?php
     
    namespace essaiBundle\Entity;
     
    use Doctrine\ORM\Mapping as ORM;
    use Symfony\Component\Security\Core\User\UserInterface;
     
    /**
     * Login
     *
     * @ORM\Table(name="login")
     * @ORM\Entity
     */
    class Login implements UserInterface, \Serializable
    {
        /**
         * @var string
         *
         * @ORM\Column(name="login", type="string", length=255, nullable=false)
         */
        private $login;
     
        /**
         * @var string
         *
         * @ORM\Column(name="password", type="string", length=255, nullable=false)
         */
        private $password;
     
        /**
         * @var \essaiBundle\Entity\Utilisateur
         *
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="NONE")
         * @ORM\OneToOne(targetEntity="essaiBundle\Entity\Utilisateur")
         * @ORM\JoinColumns({
         *   @ORM\JoinColumn(name="uId", referencedColumnName="uId")
         * })
         */
        private $uid;
     
     
     
        /**
         * Set login
         *
         * @param string $login
         *
         * @return Login
         */
        public function setLogin($login)
        {
            $this->login = $login;
     
            return $this;
        }
     
        /**
         * Get login
         *
         * @return string
         */
        public function getLogin()
        {
            return $this->login;
        }
     
        /**
         * Set password
         *
         * @param string $password
         *
         * @return Login
         */
        public function setPassword($password)
        {
            $this->password = $password;
     
            return $this;
        }
     
        /**
         * Get password
         *
         * @return string
         */
        public function getPassword()
        {
            return $this->password;
        }
     
        /**
         * Set uid
         *
         * @param \essaiBundle\Entity\Utilisateur $uid
         *
         * @return Login
         */
        public function setUid(\essaiBundle\Entity\Utilisateur $uid)
        {
            $this->uid = $uid;
     
            return $this;
        }
     
        /**
         * Get uid
         *
         * @return \essaiBundle\Entity\Utilisateur
         */
        public function getUid()
        {
            return $this->uid;
        }
     
        public function eraseCredentials() {
     
        }
     
        public function getRoles() {
     
        }
     
        public function getSalt() {
     
        }
     
        public function getUsername() {
            return $this->login;
        }
     
        public function serialize() {
     
        }
     
        public function unserialize($serialized) {
     
        }
     
    }
    Est-ce que je m'y prend juste? Y aurait-il un autre moyen de le faire plus simplement? En tout cas ca ne fonctionne pas, comment puis-je faire?

    Merci
    Bonne soirée

  2. #2
    Membre averti

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 45
    Par défaut
    salut,

    En fait, oui, il y a beaucoup plus simple. Je te conseille très fortement d'utiliser l'incontournable FOSUserBundle.
    C'est facile et rapide à installer (5 minutes) et surtout cela te permet d'avoir un système de login complet et sécurisé avec :
    - des mots de passe cryptés
    - des formulaires d'enregistrement, de login et de récupération de mot de passe déjà existants mais personnalisables
    - la possibilité de définir des rôles (simple utilisateur, admin, etc...)
    - la possibilité de récupérer l'utilisateur identifié via le service container, y compris dans les vues
    - la possibilité de personnaliser ton entité Utilisateur
    - etc...

    ++

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 23
    Par défaut
    Oui avant j'utilisait toujours FOS. Néanmoins, j'ai besoin pour cette fois d'utiliser mon propre système d'entités avec ses liaisons internes. Par exemple le login fait partit d'un entité différente que USER. Elle a en revanche une liaison 1-1 avec user et a le même id. J'imagine qu'on doit pouvoir récupérer le login facilement, mais je ne sais pas comment faire.

    En réalité, avec FOS j'aurait le même problème, FOS met lo login dans la même table que le nom et prénom, etc.

  4. #4
    Membre expérimenté
    Avatar de vinmar
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2012
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Service public

    Informations forums :
    Inscription : Août 2012
    Messages : 139
    Par défaut
    Citation Envoyé par ale252 Voir le message
    Oui avant j'utilisait toujours FOS. Néanmoins, j'ai besoin pour cette fois d'utiliser mon propre système d'entités avec ses liaisons internes. Par exemple le login fait partit d'un entité différente que USER. Elle a en revanche une liaison 1-1 avec user et a le même id. J'imagine qu'on doit pouvoir récupérer le login facilement, mais je ne sais pas comment faire.

    En réalité, avec FOS j'aurait le même problème, FOS met lo login dans la même table que le nom et prénom, etc.
    Salut,

    FOS ne met pas dans le même table le login avec le nom et le prénom, enfin disons que c'est mal dit.

    Par exemple, d'un côté tu as FOSUserBundle avec l'entité User qui tu dois étandre dans un de tes bundles, mettons : AccountBundle. Tu as donc ton entité User :
    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
     
    <?php
    namespace Acme\AccountBundle\Entity\User
     
    use FOS\UserBundle\Model\User as BaseUser;
     
    class Account extends BaseUser
    {
       /**
         * @ORM\Id
         * @ORM\Column(type="integer")
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        protected $id;
     
        public function __construct()
        {
            parent::__construct();
            // your own logic
        }
    }
    Jusque là, tu n'as pas de notion de nom ou prénom. Tu as une entité qui s'appelle Account et qui rassemble tout ce qu'il faut pour s'identifier (login/password).

    Maintenant, si tu veux créer une entité qui ne dois pas contenir les informations de connexion, tu peux créer une entité "Person" par exemple :
    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
     
    <?php
    namespace Acme\AccountBundle\Entity\Person
     
    use Acme\AccountBundle\Entity\Account;
     
    class Person 
    {
        protected $id;
     
        /**
         * @var Acme\AccountBundle\Entity\Account
         */
        protected $account;
     
        /**
         * @var string
         */
        protected $firstname;
     
     
        /**
         * @var string
         */
        protected $lastname;    
     
        [...]
    }
    Ensuite, tu fais ce qu'il faut pour définir ta relation one-to-one et le tour est joué ! Tu as deux entités : Account (qui correspond à un compte pour ce connecter) et Person (qui représente une personne).

    Perso
    Citation Envoyé par ale252 Voir le message
    Oui avant j'utilisait toujours FOS. Néanmoins, j'ai besoin pour cette fois d'utiliser mon propre système d'entités avec ses liaisons internes. Par exemple le login fait partit d'un entité différente que USER. Elle a en revanche une liaison 1-1 avec user et a le même id. J'imagine qu'on doit pouvoir récupérer le login facilement, mais je ne sais pas comment faire.

    En réalité, avec FOS j'aurait le même problème, FOS met lo login dans la même table que le nom et prénom, etc.
    Salut,

    FOS ne met pas dans le même table le login avec le nom et le prénom, enfin disons que c'est mal dit.

    Par exemple, d'un côté tu as FOSUserBundle avec l'entité User qui tu dois étandre dans un de tes bundles, mettons : AccountBundle. Tu as donc ton entité User :
    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
     
    <?php
    namespace Acme\AccountBundle\Entity\User
     
    use FOS\UserBundle\Model\User as BaseUser;
     
    class Account extends BaseUser
    {
       /**
         * @ORM\Id
         * @ORM\Column(type="integer")
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        protected $id;
     
        public function __construct()
        {
            parent::__construct();
            // your own logic
        }
    }
    Jusque là, tu n'as pas de notion de nom ou prénom. Tu as une entité qui s'appelle Account et qui rassemble tout ce qu'il faut pour s'identifier (login/password).

    Maintenant, si tu veux créer une entité qui ne dois pas contenir les informations de connexion, tu peux créer une entité "Person" par exemple :
    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
     
    <?php
    namespace Acme\AccountBundle\Entity\Person
     
    use Acme\AccountBundle\Entity\Account;
     
    class Person 
    {
        protected $id;
     
        /**
         * @var Acme\AccountBundle\Entity\Account
         */
        protected $account;
     
        /**
         * @var string
         */
        protected $firstname;
     
     
        /**
         * @var string
         */
        protected $lastname;    
     
        [...]
    }
    Ensuite, tu fais ce qu'il faut pour définir ta relation one-to-one et le tour est joué ! Tu as deux entités : Account (qui correspond à un compte pour ce connecter) et Person (qui représente une personne).

    De mon côté je rejoins foxdie, FOSUserBundle est utile sur beaucoup de points de sécurité, pas seulement sur la simple gestion login/password. Après c'est comme tu le sens

Discussions similaires

  1. [2.x] FOS User: utilisation avec plusieurs entités
    Par caema dans le forum Symfony
    Réponses: 2
    Dernier message: 22/04/2014, 15h56
  2. [MySQL-5.1] Autoriser l'accès à un user depuis plusieurs machines
    Par cyril_bft dans le forum Administration
    Réponses: 4
    Dernier message: 03/10/2013, 16h16
  3. Réponses: 4
    Dernier message: 18/10/2010, 11h10
  4. Variable accédée depuis plusieurs classes
    Par Yux dans le forum Langage
    Réponses: 5
    Dernier message: 06/01/2010, 12h01
  5. [tomcat]chargement dynamique de classes depuis une webapp
    Par alphamax dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 12/03/2004, 09h59

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