Separation of concerns – Plus loin que le MVC, utilisation de managers d’entité

Separation of concerns – Plus loin que le MVC, utilisation de managers d’entité

Le concept

Le principe de Separation of concerns consiste à découper un programme en plusieurs sections, qui gèrent le plus indépendamment que possible différentes préoccupations (contraintes, fonctionnalités, services …).

 

La modularité, l’encapsulation permettent partiellement de suivre ce principe, certains design pattern également. Le pattern MVC par exemple, permet de bien organiser son code source. Le but de MVC est justement de séparer la logique du code en trois parties que l’on retrouve dans des fichiers distincts (Modèle Vue Contrôleur). Mais il a certaines limites que nous allons dépasser en utilisant des managers.

 

La classe manager permet d’optimiser le code dans le controller. En effet, nous avons tendances à avoir besoin du même code dans plusieurs actions, voir plusieurs controllers. Cela ne permet pas d’améliorer son code par la suite de façon indépendante. On comprend vite qu’une modification dans une action ou un controller doit être systématiquement répercuté dans les actions ou controller utilisant la même logique. De ce constat résulte la best practice « Don’t repeat your self ». Enfin, et ce n’est pas négligeable, cette pratique permet d’avoir une meilleure lisibilité du code. Il faut donc refactoriser.

 

L’objectif est de renvoyer ce dont le controller à besoin, c’est à dire que si un client commande du pain, on lui livre son pain, et non la recette. Nous allons donc créer des méthodes dans nos classes manager, qui seront utiliser par la suite dans le controller, chaque classe manager étant propre à une entité du modèle et faisant le lien entre le controller et le modèle de données.

 

Utilisation de classes Manager dans Symfony2

Maintenant que l’on a fait le tour, place au cas pratique Symfony2 !

Dans notre cas, nous allons faire appel à un service Symfony afin d’intégrer les manager à nos controller.

Un service est simplement un objet PHP, associé à une configuration, qui remplit une ou plusieurs tâches. L’intérêt réel des services réside dans leur association avec le conteneur de services, c’est lui qui gère tous les services. Ainsi pour accéder à un service, il faut passer par le conteneur. Ce même conteneur nous permet de faire appel à l’injection de dépendances, c’est à dire d’inclure dans un service une instance d’un autre service.

Nous allons donc injecter dans nos fameuses classes manager le service Entity Manager de doctrine instancié par l’application Symfony comme le montre le schéma suivant, ce qui nous permettra de manipuler nos entités dans les classes manager.

Schéma manager d'entité injection de dépendance Symfony

Pour aller plus loin :