Après la mise à jour, j'ai cette obsolescence:
<?php namespace App\Service; use Symfony\Component\DependencyInjection\ContainerInterface; class ImportService { private $doctrine; private $em; public function __construct(ContainerInterface $container) { $this->doctrine = $container->get('doctrine'); //needed for database queries $this->em = $this->doctrine->getManager(); //needed for database queries } /** more methods here **/ }
Voici mon ImportService :
Since symfony/dependency-injection 5.1: The "Symfony\Component\DependencyInjection\ContainerInterface" autowiring alias is deprecated. Define it explicitly in your app if you want to keep using it. It is being referenced by the "App\Service\ImportService" service.
Alors, comment le rendre explicite? J'ai googlé un peu et je pense que je dois l'ajouter à mon fichier services.yml
une manière ou d'une autre. Mais je ne sais pas comment + dois-je le faire pour chaque classe de service?
3 Réponses :
Je viens de créer une nouvelle application 5.1 et je n'ai pas eu d'amortissement. Symfony décourage vraiment l'injection du conteneur global. Je ne suis donc pas surpris qu'il soit déprécié.
Pour corriger le message, il vous suffit de définir explicitement l'alias ContainerInterface:
class ImportService { private $em; public function __construct(EntityManagerInterface $em) { $this->em = $em }
Cela devrait faire l'affaire. Cependant, comme vous semblez passer à la version 5.1, vous devriez commencer à refactoriser votre code et injecter uniquement ce dont une classe particulière a besoin. Ce n'est pas obligatoire mais vous évitera des problèmes sur toute la ligne:
# services.yml or yaml services: Symfony\Component\DependencyInjection\ContainerInterface: '@service_container'
La première approche peut résoudre la notification, mais ne pose le problème que sur le tapis. Il vaut mieux refactoriser l'injection de construtcor, qui est promu depuis Symfony 3.3 / 3.4
Vous devez définir l'argument '@service_container' dans votre service.yaml.
# services.yml or yaml services: Symfony\Component\DependencyInjection\ContainerInterface: '@service_container' Namespace\ImportService: arguments: - '@service_container'
Ensuite, vous pouvez utiliser ContainerInterface comme paramètre de constructeur.
Alors que d'autres réponses avec l'injection de conteneur fonctionneront comme une solution rapide, c'est contre le but de cette dépréciation - supprimer toute utilisation de conteneur du code PHP .
AFAIK Symfony, ce sera de plus en plus strict à l'avenir, vous devrez donc revenir au code et le refactoriser de toute façon.
Si vous voulez rendre votre code à l'épreuve du temps, refactorisez l'injection de constructeur:
<?php namespace App\Service; use Doctrine\DBAL\Connection; use Doctrine\ORM\EntityManagerInterface; final class ImportService { private Connection $connection; private EntityManagerInterface $entityManager; public function __construct( Connection $connection, EntityManagerInterface $entityManager ) { $this->connection = $connection; $this->entityManager = $entityManager; } /** more methods here **/ }