6 votes

Comprendre les services Symfony2

Je suis assez novice en matière de Symfony 2 et je me dirige vers des sujets avancés tels que services . Quand un objet doit-il être un service ?

Par exemple, disons que vous avez un objet de façade pour faire un appel à un service REST. Cette classe a besoin d'un nom d'utilisateur et d'un mot de passe. Serait-il correct de modéliser cette classe comme un service global ? Même si elle n'est utilisée que dans une partie de l'ensemble du projet ?

# app/config/config.yml
parameters:
    my_proxy.username:  username
    my_proxy.password:  password

services:
    my_proxy:
        class:        Acme\TestBundle\MyProxy
        arguments:    [%my_proxy.username%, %my_proxy.password%]

13voto

Jakub Zalas Points 14150

Définition tirée du Glossaire Symfony2 :

Un service est un terme générique pour tout objet PHP qui exécute une tâche spécifique. Un service est généralement utilisé de manière "globale", comme un objet de connexion à une base de données ou un objet qui délivre des messages électroniques. Dans Symfony2, les services sont souvent configurés et récupérés dans le conteneur de services. Une application qui possède de nombreux services découplés est dite suivre une architecture orientée services.

Je pense que votre exemple est un candidat parfait pour un service.

Vous ne voulez pas copier le code de construction à tous les endroits où vous avez besoin de votre client API. Il est préférable de déléguer cette tâche au conteneur d'injection de dépendances.

De cette façon, la maintenance est plus facile (car la construction se fait à un seul endroit et elle est configurable).

Elle est également plus flexible, car vous pouvez facilement changer la classe du client API sans affecter le code qui l'utilise (tant qu'il implémente la même interface).

Je ne pense pas qu'il y ait une règle d'or. Mais fondamentalement, toutes les classes implémentant une tâche sont de bons candidats pour un service. Les entités, par contre, ne le sont pas, car elles ne sont le plus souvent que des détenteurs de données.

Je recommande toujours la série d'articles de Fabien sur le sujet : http://fabien.potencier.org/article/11/what-is-dependency-injection

1voto

greg0ire Points 11346

Oui, car cela vous épargnera la partie configuration. Vous n'aurez pas à récupérer le nom d'utilisateur et le mot de passe et à les donner au constructeur à chaque fois que vous aurez besoin de cette classe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X