5 votes

Symfony crée un nouveau service en tant que nouvelle instance

J'ai un service défini avec plusieurs injections de dépendances dans le constructeur. À un moment donné, je veux obtenir le service en tant que nouvelle instance au lieu de la même instance déjà créée. Notez que normalement je veux que le service soit partagé, mais dans un cas limite je veux créer une nouvelle instance, donc l'option partagée dans la définition du service n'est pas applicable.

Je peux créer un nouvel objet, mais je devrais alors injecter les dépendances manuellement, et je préférerais laisser symfony s'en occuper.

Alors comment puis-je dire à Symfony de retourner un service comme une nouvelle instance ?

Merci.

9voto

axiac Points 13906

Pour autant que je sache, il n'y a aucun moyen de dire au conteneur d'injection de dépendance de Symfony de retourner parfois l'instance partagée, et d'autres fois une nouvelle instance d'un service.

Par défaut, les services sont partagés, comme vous l'avez déjà constaté. Vous pouvez demander au conteneur de créer un service non partagé en fixant le shared pour false dans la définition de votre service :

# app/config/services.yml
services:
    AppBundle\SomeNonSharedService:
        shared: false

Armé de ces connaissances, je pense que la solution à votre problème est de créer un duplicata du service partagé avec un nom différent et de le marquer comme non partagé comme expliqué ci-dessus. Lorsque vous demandez au conteneur de récupérer le duplicata, il créera une nouvelle instance à chaque fois.

N'essayez pas de créer le duplicata comme un alias du service original, cela ne fonctionne pas. La première chose que l'implémentation de Contaner::get() recherche l'ID du service fourni en argument dans la liste des alias et utilise l'ID du service original à la place s'il le trouve.

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