1
votes

Symfony: définition explicite du conteneur en service

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?


0 commentaires

3 Réponses :


4
votes

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'


1 commentaires

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



1
votes

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.


0 commentaires

-1
votes

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.

Refactoriser l'injection de dépendances

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 **/
}


0 commentaires