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

Doctrine2 PHP Discussion :

Surcharger les entités


Sujet :

Doctrine2 PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    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 Surcharger les entités
    Bonjour,

    Je débute sur Symfony2 et je m'étonne de ne pas pouvoir surcharger les entités générées par Doctrine.

    En détail :
    • J'ai généré mes entités avec Doctrine2 à partir de ma base existante.
    • Je cherche à développer l'authentification de type "form_login" avec le SecurityBundle
    • Je cherche donc à mapper mon entité User (provenant de ma base) sur le SecurityContext


    Mon problème vient du fait que, d'après ce que j'ai compris, l'entité utilisée pour mapper la classe User doit implémenter l'interface UserInterface propre à Symfony. J'aimerais ne pas avoir à modifier mon entité User générée par Doctrine2 mais plutôt la surcharger pour pouvoir regénérer mes entités tranquillement avec Doctrine2 sans toucher à ce que j'ai déjà codé...

    Ai-je loupé quelque chose de crucial ou bien la structure de Symfony2 ne permet-elle tout simplement pas ceci ?

    Merci pour vos éclaircissements,

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 319
    Par défaut
    Salut,

    J'ai pas compris pourquoi tu dis que tu peux pas surcharger une entitee. Qu'est-ce qui t'empeche de faire class MyUser extends UserEntity ?

    J'utilise FOS\UserBundle mais c'est le meme principe (peut etre regenere sans affecter mon code), ca se presente comme ca :

    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
    <?php
     
    namespace Asso\TestBundle\Entity;
    use FOS\UserBundle\Entity\User as FOSUser;
     
    /**
     * @orm:Entity
     */
    class User extends FOSUser // implements UserInterface pour toi
    {
    // ici tu implemente ton interface UserInterface en rajoutant les vars et les getter/setter. Par exemple quand je surcharge FOS\User je dois gerer moi-meme la colonne id
        /**
         * @orm:Id
         * @orm:Column(type="integer")
         * @orm:GeneratedValue(strategy="AUTO")
         */
        protected $id;
     
    }

  3. #3
    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
    En fait c'est surtout une question d'arborescence. Effectivement je peux très bien modifier la classe User générée par Doctrine (correspondant à ma table user) et la faire implémenter l'interface. Mais je ne veux pas car cette classe correspond à une table et je (pense que je) perdrai mon code si je les regénérais (après une modif du modèle par exemple).

    Du coup je souhaitais créer un dossier au même niveau que MyCompany/MyBundle/Classes pour y mettre mes classes surchargées mais Doctrine n'en veut pas car ce n'est pas une classe générée par lui-même...

    Je vais essayer en "rangeant" mes classes surchargées dans un sous-dossier de Entity pour voir...

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 319
    Par défaut
    Mais ca veut dire quoi Doctrine n'en veut pas ?

    Dans mon exemple, FOSUser correspond a ton entitee generee par doctrine, et User correspond a ta classe aui surcharge FOSUser et qui implemente UserInterface. C'est exactement ce que tu veux et ca marche parfaitement.

  5. #5
    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
    Citation Envoyé par winzou Voir le message
    Mais ca veut dire quoi Doctrine n'en veut pas ?

    Dans mon exemple, FOSUser correspond a ton entitee generee par doctrine, et User correspond a ta classe aui surcharge FOSUser et qui implemente UserInterface. C'est exactement ce que tu veux et ca marche parfaitement.
    Ta classe FOSUser correspond à une table dans ta base ? De mon côté j'ai déjà une base existante avec une table user que je souhaiterais conserver en l'état.

  6. #6
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Je pense que le problème vient de la méthodologie.

    Tu parts d'une base pour arriver à un modèle difficile à adapter.

    L'idée dans Sf2 (et doctrine 2) (comme dans Sf1) est qu'il faut partir du modèle pour générer la base. La base est une conséquence du modèle objet, pas le contraire.

  7. #7
    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
    J'ai testé avec cette structure :

    app
    bin
    web
    src
    MyCompany
    MyBundle
    Entity
    MyEntities
    User.php
    User.php

    Contenu de MyCompany\MyBundle\Entity\MyEntities\User.php :
    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
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    <?php
     
    namespace MyCompany\MyBundle\Entity\MyEntities;
     
    use MyCompany\MyBundle\Entity\User as EntityUser;
    use Symfony\Component\Security\Core\User\AdvancedUserInterface;
    use Symfony\Component\Security\Core\User\UserInterface;
     
    /**
     * MyCompany\MyBundle\Entity\MyEntities\User
     */
    /**
     * @orm Entity
     */
    class User extends EntityUser implements AdvancedUserInterface
    {
       //**************************************************************
       //   Méthodes définies par l'interface AdvancedUserInterface
       //**************************************************************
     
       /**
        * Interface AdvancedUserInterface
        * Retourne le password
        *
        * @return string Le password du client
        */
      	/*public function getPassword()
      	 {
      	 return $this->password;
      	 }*/
     
       /**
        * Interface AdvancedUserInterface
        * Retourne le username
        *
        * @return string L'email du client
        */
      	public function getUsername()
      	{
      	   return $this->getEmail();
      	}
     
      	/**
        * Interface AdvancedUserInterface
        * Retourne le niveau de droit
        *
        * @return Array Privilèges du User
      	 */
      	public function getRoles()
      	{
      	   return array('IS_AUTHENTICATED');
      	}
     
      	/**
        * Interface AdvancedUserInterface
        * Efface les droitsloginAction
      	 */
      	public function eraseCredentials()
      	{
      	}
     
      	/**
        * Interface AdvancedUserInterface
        * Retourne le "salt"
        *
        * @return string Security salt
      	 */
      	public function getSalt()
      	{
      	   return '';
      	}
     
      	/**
      	 * Interface AdvancedUserInterface
      	 * Matche un compte et un username
      	 *
      	 * @param UserInterface $user
      	 * @return Boolean Coorespondance ou non entre un compte et un username
      	 */
      	public function equals(UserInterface $user)
      	{if (!$user instanceof User) {
      	   return false;
      	}
     
      	if ($this->getPassword() !== $user->getPassword()) {
      	   return false;
      	}
     
      	if ($this->getSalt() !== $user->getSalt()) {
      	   return false;
      	}
     
      	if ($this->getUsername() !== $user->getUsername()) {
      	   return false;
      	}
     
      	if ($this->isAccountNonExpired() !== $user->isAccountNonExpired()) {
      	   return false;
      	}
     
      	if ($this->isAccountNonLocked() !== $user->isAccountNonLocked()) {
      	   return false;
      	}
     
      	if ($this->isCredentialsNonExpired() !== $user->isCredentialsNonExpired()) {
      	   return false;
      	}
     
      	if ($this->isEnabled() !== $user->isEnabled()) {
      	   return false;
      	}
     
      	return true;
      	}
     
      	/**
      	 * Retourne l'état de non-expiration du compte
      	 * @return Boolean True si non-expiré
      	 */
      	public function isAccountNonExpired()
      	{
      	   return true;
      	}
     
      	/**
      	 * Retourne l'état de non-verrouillage du compte
      	 * @return Boolean True si non-verrouillé
      	 */
      	public function isAccountNonLocked()
      	{
      	   return true;
      	}
     
      	/**
      	 * Retourne l'état de non-expiration des privilèges
      	 * @return Boolean True si non-expiré
      	 */
      	public function isCredentialsNonExpired()
      	{
      	   return true;
      	}
     
      	/**
      	 * Retourne l'état d'activation du compte
      	 * @return Boolean True si activé
      	 */
      	public function isEnabled()
      	{
      	   return true;
      	}
     
       //**************************************************************
       //**************************************************************
    }
    J'obtiens cette erreur :
    ( ! ) Fatal error: Uncaught exception 'Doctrine\ORM\Mapping\MappingException' with message 'No mapping file found named 'MyCompany.MyBundle.Entity.MyEntities.User.dcm.xml' for class 'MyCompany\MyBundle\Entity\MyEntities\User'.' in /php/sellerPhp/src/main/php/mycompany/vendor/doctrine/lib/Doctrine/ORM/Mapping/MappingException.php on line 68
    Si je rajoute le fichier demandé (copié-collé de celui existant avec changement de nom et référence au Bundle à l'intérieur), j'obtiens cette erreur (dûe au fait qu'il y ait 2 fois la description d'une même table...) :
    ( ! ) Fatal error: Uncaught exception 'Doctrine\ORM\Mapping\MappingException' with message 'Duplicate definition of column 'email' on entity 'MyCompany\MyBundle\Entity\MyEntities\User' in a field or discriminator column mapping.' in /php/sellerPhp/src/main/php/mycompany/vendor/doctrine/lib/Doctrine/ORM/Mapping/MappingException.php on line 227
    Et donc je ne vois pas d'autre solution que de modifier la classe MyCompany\MyBundle\Entity\User générée par Doctrine, au risque de perdre mon code lors d'une regénération via Doctrine....

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 319
    Par défaut
    Citation Envoyé par pc.bertineau Voir le message
    Si je rajoute le fichier demandé (copié-collé de celui existant avec changement de nom et référence au Bundle à l'intérieur), j'obtiens cette erreur (dûe au fait qu'il y ait 2 fois la description d'une même table...) :
    Non il ne faut pas faire de copier-coller. Essaie de lui faire ce fichier en ne definissant aucune colonne dedans. Etant donne qu'il etend l'autre entite, il ne faut evidemment pas lui faire definir des colonnes deja definies.

    Tu as dit a Doctrine que ton mapping etait fait en yml/xml ? Parce que la 1ere erreur que t'as vient du fait qu'il ne se satisfait pas des annotations que tu as mis dans Entity\MyEntities\User. Essaie de synchroniser tout : utilise soit les annotations partout, soit yml/xml partout.

    Rien a voir, mais les annotations sont cools parce que plus tard pour les formulaires tu vas creer des contraintes (email, minlenght=5, etc). Ces contraintes se definissent soit dans un fichier a part (et ca fait 2 fichiers a gerer avec ton model), soit egalement en annotations (en meme temps que ton model).

  9. #9
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 319
    Par défaut
    Ou alors je viens de voir, tu as mis en annotation "@orm Entity" alors que j'ai "@orm:Entity". C'est peut-etre pour ca qu'il ne prend pas en compte ton annotation !

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 16/02/2007, 20h33
  2. est ce possible de surcharger les operateurs
    Par dietrich dans le forum Delphi
    Réponses: 5
    Dernier message: 26/08/2006, 11h15
  3. Réponses: 2
    Dernier message: 25/05/2006, 18h34
  4. Surcharger les librairies Java
    Par matiouz dans le forum API standards et tierces
    Réponses: 12
    Dernier message: 20/05/2006, 20h46
  5. Réponses: 9
    Dernier message: 13/04/2006, 11h40

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