Hello,

Actuellement dans une application Symfony j'ai une entité assez mastoc, qu'on va appeler "Dossier".
Cette entité a plusieurs dizaines d'attributs, et des relations avec une dizaine d'autres entités en oneToMany ou manyToMany.
Ces "Dossiers" peuvent être de 5 types différents, de "A" à "E".
Certains attributs seront différents en fonction du type (immuable) auquel appartient ce Dossier. Par exemple :

  • Quand j'affiche le numéro du Dossier avec $dossier->getNumero(), on doit accoler le type de Dossier devant le numéro. Le numéro stocké en BDD, par exemple 18231, doit donc apparaître sous la forme "A18231".
  • Quand je demande le service responsable d'un Dossier avec la méthode $dossier->getService(), le résultat doit varier en fonction du type de Dossier, (Service compta pour les Dossiers A, service RH pour les Dossiers B....)

De nombreux comportements sont ainsi basés sur le type du Dossier.
J'ai un dilemme sur la façon de procéder, car plusieurs solutions s'offrent à moi :
1 - Créer une entité "Type" et rajouter ainsi une table dans la BDD pour 5 lignes qui ne bougeront jamais. Ce qui rajoutera en prime une liaison sur ma table principale que je trouve déjà bien chargée. L'avantage que j'y trouve, c'est la facilité de faire des choses comme $dossier->getType()->getService() par exemple.
2 - Stocker ce Type sous forme d'int dans un attribut "typeID", et hardcoder les différents comportements des méthodes avec des switch de partout. Ce qui ne me semble pas terrible niveau lisibilité du code de la classe Dossier.

J'aurais presque pu utiliser des enums (et encore, l'objet Type serait trop dodu pour ça...) mais on est sur une vieille version de PHP.

Si vous avez déjà été confronté à un choix de design de ce genre, je suis preneur de vos retours :)

2 réponses


Hello :)

Alors pour l'utilisation des id si tu veux que ce soit lisible tu peux utiliser des constantes pour choisir le type, et au lieux de hardcoder "tout" tu modif juste le getType

class LeModele {
    public const TYPE1 = 1;
    public const TYPE2 = 2;
    public const TYPE3 = 3;
    public const TYPE4 = 4;
    ...
}

class AvecGetType {
    public function getType() {
        // blabla conditions...
        return LeModele::TYPE1;
    }
}

Bon après je donne juste une idée à l'aveugle ce serait plus simple en voyant les extraits de code et leurs interactions :p

Et si tu utilises PHP 8.1 ou supérieur, tu as directement l'accès aux enum https://www.php.net/manual/fr/language.enumerations.php