Bonjour,
Imaginons que vous travailliez sur un système de contrats avec un montant (€) pouvant subir une opération, devenant un autre montant. Le dev front vous demande à ce que chaque contrat affiche et le montant originel, et le montant après exécution de ladite opération - sans que ce dernier soit enregistré en base. Précisions qu’à un moment donné, dans l’application, ce montant sera cependant bien enregistré en base.
Vous créez donc un contrôleur, CalculerNouveauMontant
, permettant d’enregistrer en base ce montant sur tel ou tel contrat (fourni en entrée), mais de plus : vous prenez soin d’avoir recours à un booléen "simulation" (fourni en entrée). S’il vaut vrai, aucun enregistrement en base n’a lieu (et inversement s’il vaut faux). Ce contrat et ce booléen sont bien sûr envoyés par le front.
Dans la ressource HTTP "ContratResource", c’est-à-dire dans l’"objet" JSON "contrat" que vous retournez au front, vous définissez bien sûr les deux champs "montant" et "montant_apres_operation" : le premier est directement valué grâce à l’ORM. Mais "montant_apres_operation", vous l’avez écrit en tant que champ calculé : c’est vous qui l’avez défini de sorte que vous appelez votre contrôleur en passant en entrée le booléen "simulation" à vrai (et vous fournissez en entrée le contrat actuel - rappel : vous êtes dans la ressource ContratResource, donc vous y avez bien sûr accès via $this
).
Question
Cela va-t-il à l’encontre des principes RESTful ? On pourrait penser qu’un contrôleur = 1 seule responsabilité et que vous violez ce principe. (Bien que d’après moi, le principe est ici de calculer un nouveau montant - seul l’enregistrement ou non en base est le point de divergence).
Question + ouverte encore : Est-ce une mauvaise pratique dans le cadre d’un développement professionnel dans une startup web ?
Alternatives
Je suggérais de mettre en place une classe parente abstraite réalisant le calcul du nouveau montant, et de définir deux contrôleurs (un pour la simulation, un autre pour l’enregistrement). Tous deux en héritant.
On m’a refusé ça pour mettre à la place :
-
un contrôleur réalisant la simulation
-
un contrôleur mettant à jour tout contrat, au sens large du terme : on pourrait y passer n’importe quel couple (clé ; valeur), même en-dehors de ce calcul de nouveau montant. On pourrait alors l’utiliser pour mettre à jour le nom du contrat par exemple. (Alors que cela a lieu au sein de certaines "grandes" fonctionnalités du projet, comme le fait de pouvoir mettre à jour un contrat via une modale en front : un contrôleur est dédié à ça. Dès lors, le fait de créer ce nouveau contrôleur de mise à jour de tout contrat "au sens large du terme" me paraît être une toute nouvelle approche de développement, et un peu bizarre car pas liée à une fonctionnalité en particulier).
Qu’en pensez-vous ? Quelle est la meilleure solution entre ces 2 voire d’autres ?
Merci et bonne journée.