Bonjour,

J'ai une question concernant l'injection de dépendance dans les services.

Quand on créé un service dans Symfony, il faut le définir dans un fichier services.yml sous la forme suivante :

services:
    mon.service:
        class: MonBundle\chemin\vers\MonService
        arguments: [@doctrine, @autre_service]

Dans cet exemple, j'indique que 2 services doivent être injectés dans le constructeur de MonService, ce qui me donne :

namespace MonBundle\chemin\vers;
class MonService {

    private $doctrine;
    private $autre_service;

    public function __construct($doctrine, $autre_service)
    {
        $this->doctrine = $doctrine;
        $this->autre_service = $autre_service;

        // A partir d'ici, je peux utiliser librement les 2 services "doctrine" et "autre_service" au sein de cette class
    }
}

Dans certains cas, je peux avoir jusqu'à 5 services à injecter. Ma question est donc la suivante :

Vaut'il mieux injecter ces 5 services comme l'exmple plus haut, ou injecter uniquement le service "service_container" qui me permettra ensuite d'accèder à autant de service que je souhaite ?

Exemple :

services:
    mon.service:
        class: MonBundle\chemin\vers\MonService
        arguments: [@service_container]
namespace MonBundle\chemin\vers;
class MonService {

    private $container;
    private $doctrine;
    private $autre_service;

    public function __construct(ContainerInterface $container)
    {
        $this->container = $container;

        // A partir d'ici, je peux utiliser librement autant de service que je veux au sein de cette class
        $this->doctrine = $this->container->get('doctrine');
        $this->autre_service = $this->container->get('autre_service');

    }
}

Quelle est la bonne pratique ?

Merci d'avance.

5 réponses


TuxBoyBzh
Réponse acceptée

Salut,

Oui, quand il y a trop de paramètre c'est pas très bon dans ton construct, mais c'est vrai que 5 ne reste pas énorme, ça dépend sur quelle version de Symfony tu es, mais sinon tu peux activer l'Autowriting ce qui permet de faire de l'injection de dépendnace automatiquement sans définir de service : https://symfony.com/doc/current/service_container/autowiring.html

betaWeb
Réponse acceptée

@jeanMat A la limite, je pense que tu n'injectes qu'une référence vers l'objet @service_container (je ne suis pas sûr) donc ça ne pose pas trop de souci. Après c'est la porte ouverte au code un peu bordélique, en celà que tu vas préférer tout gérer dans ton service par simplicité plutôt que de bien encapsuler et séparer tes classes et services, tu me suis ? ;)
Sinon, l'activation de l'autowriring comme le suggère @TuxBoyBzh reste une bonne idée.

Salut,

Je pense que c'est à toi de voir comment tu souhaites faire, et ça dépend de certains facteurs (évolution du service, tests unitaires etc) :)
Cinq dépendances ça commence à faire, ceci dit ce n'est pas non plus énorme ;)

jeanMat
Auteur

Merci pour vos réponses.
Je suis sur Symfony 2.8

En fait, par fainéantise et par confort, je préfèrerai injecter uniquement @service_container, comme ça je suis tranquille et libre ensuite d'appeller les service que je souhaite. Mais je me demandais si c'était une bonne pratique et si ce n'était pas plus lourd que d'injecter uniquement les quelques services dont j'ai besoin.

jeanMat
Auteur

Merci, c'est très clair.
Je n'ai jamais utiliser l'autowriring, je vais regarder ça. Merci à vous 2