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 :

Condenser mon code [2.x]


Sujet :

Symfony PHP

  1. #1
    Membre averti
    Inscrit en
    Juin 2013
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Juin 2013
    Messages : 23
    Par défaut Condenser mon code
    Bonjour,

    Le titre n'est pas bien explicite mais je ne savais pas trop comment nommer mon problème.

    J'ai trois entités principales : TypeA et TypeB reliées en ManyToOne à User.

    J'ai deux entités "intermédiaires" : UserTypeA et UserTypeB, qui contiennent les attributs des relations ManyToOne (par exemple, la note qu'un utilisateur a attribué à un produit de type A). Ces deux entités et leur repository sont identiques (sauf que l'une est reliée à TypeA et l'autre à TypeB).

    Le problème est que je n'arrive pas à condenser mon code dans mon controller :

    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
    public function typea_noterAction(TypeA $typea)
    {
       $user = $this->getUser();
       $userTypeA = $this->getDoctrine()
                          ->getManager()
                          ->getRepository('GamUserBundle:UserTypeA')
                          ->getNote($user, $typea);
     
       //Reste du code
    }
     
    public function typeb_noterAction(TypeB $typeb)
    {
       $user = $this->getUser();
       $userTypeB = $this->getDoctrine()
                          ->getManager()
                          ->getRepository('GamUserBundle:UserTypeB')
                          ->getNote($user, $typeb);
     
       //Reste du code
    }
    Le reste du code est identique (en remplaçant juste TypeA par TypeB). J'ai donc tout un tas de routes et tout un tas de code copier/coller dans mon controller. Y aurait-il un moyen d'éviter ça ? De même pour mes entités intermédiaires et leur repository, c'est juste un gros copier/coller, est-ce possible condenser ça ?

  2. #2
    Membre Expert Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Par défaut
    Hello,

    Je te suggèrerais de commencer par faire une entité abstract qui contient tous les attributs et deux classes qui l'étendent.

    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
     
    /**
     * @ORM\Table(name="Table_Type")
     * @ORM\Entity(repositoryClass="Path/To/RepositoryClass")
     * @ORM\InheritanceType("SINGLE_TABLE")
     * @ORM\DiscriminatorColumn(name="type", type="string")
     */
    abstract class TypeAbstract {
        /**
         * @ORM bla bla bla
         */
        protected $user;
    }
     
    /**
     * @ORM\Entity
     */
    class TypeA extends TypeAbstract {
        /**
         * @ORM pif paf pouf
         */
        protected $note;
    }
     
    /**
     * @ORM\Entity
     */
    class TypeB extends TypeAbstract {
        /**
         * @ORM poc poc poc
         */
        protected $note;
    }
    Cette partie te permettra de jouer avec la classe abstraite pour tout ce qui concerne les deux types.
    Une colonne sera rajoutée à la table pour que l'ORM puisse mapper les données sur une entité ou l'autre.

    Ils partagent maintenant le même repository, donc tu peux condenser

    ++

  3. #3
    Expert confirmé
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Par défaut
    Je partage l'opinion de Nico_F : un parent commun aux deux classes est la solution la plus évidente.

    Alternativement, PHP propose un mécanisme appelé Traits. Pour faire simple, un trait, c'est un paquet de fonctions regroupées par thème, qu'on peut attacher aux classes qu'on veut. Les traits sont inspirés des mixins qu'on trouve dans d'autres langages.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  4. #4
    Membre averti
    Inscrit en
    Juin 2013
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Juin 2013
    Messages : 23
    Par défaut
    Merci, ça va déjà bien réduire mon code !

    Et je vais me renseigner sur cette histoire de Traits.

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2009
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2009
    Messages : 82
    Par défaut
    Pour utiliser les Traits réguliérement, et bin c'est vraiment Traits bien ;-)

  6. #6
    Membre Expert Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Par défaut
    J'émets tout de même une réserve quand à l'utilisation des Traits, dans la mesure ou ils répondent à des problématiques que PHP ne gére pas, notamment l'héritage multiple.
    Ils sont donc une alternative (élégante ou pas je ne sais pas, je n'ai pas vraiment d'avis dessus) à des extensions ou des helpers de classes.

    En revanche, dans la mesure ou sa problématique peut être résolue avec une modèle bien pensé et de l'héritage simple, j'opterais tout de même pour de l'héritage plutôt que l'utilisation de Traits (option de facilité). Qui plus est si, pour partager une seule table et un seul repository, on doit de toute manière passer de l'héritage.

  7. #7
    Expert confirmé
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Par défaut
    Voilà un avis plein de sagesse

    Pour moi les traits c'est séduisant parce que c'est rapide à mettre en place et ça demande peu de réflexion. Ça colle avec l'aspect script de PHP et sa fameuse tolérance (typage dynamique, erreurs laxistes, etc.). C'est bien pour les fois où on n'a pas envie de se creuser la tête, quand on veut faire quick and dirty
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  8. #8
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2009
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2009
    Messages : 82
    Par défaut
    Perso j'utilise les traits pour garder une cohérence entre mes entités qui partagent des attributs communs

    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
    trait BasicUserEntity
        {
            /**
             * @var string
             * @ORM\Column(name="email", type="string", nullable=true, unique=true)
             * @Assert\NotBlank()
             */
            protected $email;
     
            /**
             * @ORM\Column(name="first_name", type="string", nullable=true)
             * @Assert\NotBlank()
             */
            protected $firstName;
     
            /**
             * @ORM\Column(name="last_name", type="string", nullable=true)
             * @Assert\NotBlank()
             */
            protected $lastName;
        }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Class User extends AbstractUser
        {
            use BasicUserEntity, TimestampableEntity
        }
     
    Class Address
        {
            use BasicUserEntity
        }

    du coup je peux définir les asserts dans mon trait, je trouve que ça apporte une flexibilité très intéressante pour tout ce qui est destiné à être réutilisé

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

Discussions similaires

  1. Mon code n'est pas interprété !
    Par korriganez dans le forum Langage
    Réponses: 3
    Dernier message: 31/05/2006, 15h46
  2. [Exécutable]puis je creer un executable a partir de mon code ?
    Par youpileouf dans le forum Général Java
    Réponses: 3
    Dernier message: 17/06/2005, 09h15
  3. Optimiser mon code ASP/HTML
    Par ahage4x4 dans le forum ASP
    Réponses: 7
    Dernier message: 30/05/2005, 10h29
  4. Réponses: 1
    Dernier message: 21/02/2005, 12h40
  5. [langage] algo de bissection dans mon code
    Par killy dans le forum Langage
    Réponses: 5
    Dernier message: 19/01/2004, 18h35

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