Symfony — Charger dynamiquement des services avec le ServiceSubscriber

NicolasFz.code
3 min readSep 26, 2020

--

Dans cet article, j’explique comment implémenter une interface sur des services puis déterminer lequel utiliser selon vos besoin via le ServiceSubscriber

Utiliser le Service Subscriber va permettre à votre code d’être plus souple et plus versatile.

Vous pourrez par exemple choisir de charger un service spécifique selon que vous ayez besoin de traiter un fichier au format CSV, TXT ou EXEL, ou alors pour faire appel à des Web-Services différents.

Pour cet article, j’ai choisi quelque chose d’un peu plus simple. J’ai voulu créer différents services qui vont m’aider à savoir quoi répondre à mon ami en fonction de ses actions (oui, je ne suis pas très doué dans les interactions sociales !)

Pour commencer, créons une interface qui va définir ce que nos services devront savoir faire. C’est nécessaire afin que nous puissions plus tard les utiliser indifféremment les uns des autres.

Ici mes services devront être capables de répondre à mon ami via la méthode saySomething()

Une fois l’interface crée, il ne reste plus qu’a l’implémenter dans les différents services.

On commence par un service qui sait uniquement répondre “Hello !”

Ensuite un service qui répond “Goodbye …” (de manière un peu triste)

Comme vous pouvez le voir, dans les deux cas on implémente l’interface via le mot clé “implements DefaultServiceInterface” et on défini le comportement de la méthode saySomething(). Sans ça, les services ne fonctionneraient pas.

C’est maintenant que vient la magie ! Nous allons créer un service qui implémente l’interface ServiceSubscriberInterface. Ce dernier va nous permettre de définir lequel de nos services précédemment créés utiliser en fonction d’un critère spécifique. Ici le critère va être un code qui représente l’action de notre amis (malheureusement imaginaire …)

Lorsque l’on implémente l’interface, il est nécessaire de définir la méthode getSubscribedService(). C’est dans cette méthode que l’on va définir quel service charger en fonction de notre critère (via un tableau associatif).

Dans le constructeur, il faut également charger le service Locator qui va nous permettre de “charger” les services précédemment créés.

Une fois ceci fait, notre service peut utiliser la méthode $this->locator->get() qui va s’occuper de charger le bon service en fonction de l’argument qui lui sera passer en paramètre.

Et voilà ! C’était plutôt simple n’est-ce pas ?

Maintenant il ne nous reste plus qu’a créer notre Controller pour tester les différents cas de figures.

Vous pouvez lancez un serveur de test avec la commande à exécuter dans un terminal à la racine de votre projet.

symfony server:start

Maintenant, lorsque vous allez sur l’url “http://localhost:8000/coming” vous devriez obtenir en réponse :

My friend is comming, I should say: Hello !

Et lorsque vous allez sur l’url “http://localhost:8000/leaving” vous devriez obtenir en réponse :

My friend is leaving, I should say: Goodbye…

Bien sur, pour un cas comme ça, utiliser le serviceSubscriber c’est un peu “Overkill”. Un simple “switch-case” aurait amplement suffit.

Utilisez le service subscriber lorsque vous voulez effectuer des actions relativement similaires mais avec des entrant ou des sortants très différents. Par exemple si vous voulez laisser à votre utilisateur la possibilité de récupérer la météo sur plusieurs services différents. Dans chaque cas, votre but est de récupérer la météo, pourtant il vous faudra probablement utiliser des web-services différents.

Si vous souhaitez voir plus en détail le code et l’organisation des classes, vous pouvez également tout retrouver sur mon github :

Voilà, j’espère que ce petit article vous a plu. Si c’est le cas, n’hésitez pas à me le dire en commentaire et à mettre un petit applaudissement ;)

--

--

NicolasFz.code
NicolasFz.code

Written by NicolasFz.code

Lead Développeur PHP/Symfony, Chargé de recrutement technique

Responses (2)