[Symfony] Symfony4 AbstractController et création d’alias de service

Aujourd’hui, je vous propose de faire le point sur la déclaration de service dans Symfony (notamment Symfony 4) et de comment les récupérer dans les contrôleurs. Nous allons aussi voir la différence entre les classe Controller et AbstractController étendu par nos contrôleurs.

 ❗  Pour la suite de l’article vous devez avoir un installation de Symfony 4 (Pour Symfony 3, AbstractController n’est pas disponnilbe) et une route pointant vers l’action ‘indexAction’ du contrôlleur DefaultController.

Le service

Pour notre exemple, nous allons créer un service permettant de formater/filtrer nos chaînes de caractères. Ci dessous, la classe avec une méthode permettant supprimer tout les caractère spéciaux d’une chaîne.

Utilisation du service dans un controlleur étendant de de la classe Controller de Symfony (Comme sur Symfony 3)

Déclarons ce service auprès de Symfony dans le fichier config/services.yaml

Appelons notre service dans un contrôleur héritant du contrôleur de base de Symfony (recommandé sur Symfony 3, mais nous verrons par la suite que les choses ont évolués 😉 ). Dans celui ci, rien de bien compliqué, on retourne simplement une réponse contenant une chaîne dans laquelle les caractères spéciaux sont supprimés.

 

Cette action va affiché une page blanche avec le texte “toto”.

Utilisation du service dans un contrôleur étendant de de la classe AbstractController de Symfony (Recomandé sur Symfony 4)

Cette méthode fonctionne et était utilisé par Symfony 3, mais les développeur de Symfony se sont rendu compte que votre contrôleur chargeait tout les services souvent inutilement. Dans Symfony 4, il est recommandé d’étendre AbstractController et non Controller.

Modifiez donc votre contrôleur de la sorte et rafraîchissez votre page.

 

 ❗  😡  Mais tu te fou de nous, ça génère une erreur :

Effectivement, l’erreur ci-dessous à dû s’afficher :

L’erreur vient du fait que AbstractController contient un conteneur de service réduit (comme l’explique l’erreur).  Vous trouverez les services inclue par défaut dans la classe AbstractController :

Quelques explication s’impose  😉

La méthode ‘getSubscribedServices’ retourne un tableau de la forme ‘Nom du service’ => ‘Classe du service’ (La classe doit également être définie dans le fichier services.yaml comme alias de notre service). Seul ces services seront accessible dans notre contrôleur.

 💡  le point d’interrogation ‘?’ indique un service qui n’est pas obligatoire. Je ne suis pas aller voir en détaille le fonctionnement de Symfony à ce sujet, mais je suppose que les services de se type ne sont inclue que à la demande.

Comme je le disait ci dessus, nous devons déclarer notre classe comme alias de notre service (nous verrons ci-dessous, que créer cette Alias à une autre utilité très pratique).

Les deux dernières ligne permettent de déclarer la classe ‘App\Format\FormatText’ comme alias du service ‘app.format_text’. Il ne nous reste plus qu’a dire à notre contrôleur qu’il doit injecter ce service dans le gestionnaire de service. Pour cela, nous allons surcharger la méthode ‘getSubscribedServices’ comme ci-dessous.

Mettez a jours votre page et paf ça fait des chocapic ! la magie opère (oui la blague date d’une publicité d’il y a 15 ans, mais je ne suis plus tout jeune ^^)

 

Notre alias nous permet d’utiliser notre service comme injection de dépendance dans les contrôlleurs

C’est bien, nous avons un service accessible depuis nôtres contrôleur qui pourtant n’utilise que les services minimums, mais l’alias que nous avons ajouté permet des chose bien plus puissantes. En effet, nous pouvons utiliser l’injection de dépendance automatique de Symfony pour injecter notre service dans les contrôleurs. Reprenons notre exemple :

Le type du paramètre ‘$formatText’ est trouvé dans la liste des services connu par Symfony et ce dernier va donc créer une instance de notre service au sain de la variable ‘$formatText’.

Et ça c’est vraiment pratique !

 

Voilà, c’est tout pour aujourd’hui, si vous avez des questions ou/et remarque, n’hésitez pas à les écrire en commentaire.

 

3 Commentaires

Ajouter un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *