web-dev-qa-db-fra.com

Symfony 4 - Service supprimé ou en ligne bien qu'il soit public

J'essaie de migrer une application SF 3.3 vers SF 4 avec sa nouvelle structure de répertoires et tout.

Je me bats sur cette exception:

Le service ou l'alias "simplethings_entityaudit.reader" a été supprimé ou inséré lors de la compilation du conteneur. Vous devez soit le rendre public, soit cesser d'utiliser directement le conteneur et utiliser l'injection de dépendance à la place.

(Ce service provient d'un ensemble externe situé dans/fournisseur).

Néanmoins, quand je bin/console debug:container simplethings_entityaudit.reader Vous verrez que le service existe et est public:

 Informations pour le service "simplethings_entityaudit.reader" 
 ================================== ========================= 
 
 --------------- -- -------------------------------------- 
  Valeur d'option                                 
 ----------------- ------------------------------- ------- 
 ID de service simplethings_entityaudit.reader 
 Classe SimpleThings\EntityAudit\AuditReader 
 Tags - 
 Public oui 
 Synthétique non 
 Paresseux non 
 Partagé oui 
 Résumé non 
 Câblé automatiquement non 
 Autoconfiguré non [.__ __.] Service d'usine simplethings_entityaudit.manager 
 Méthode d'usine createAuditReader 
 ----------------- ------------ -------------------------- 

Ce service est actuellement appelé dans l'un des miens avec $this->container->get('simplethings_entityaudit.reader').

J'ai également essayé d'injecter SimpleThings\EntityAudit\AuditReader Dans mon constructeur de services, mais voici ce que j'obtiens:

L'argument "$ auditReader" de la méthode "__construct ()" fait référence à la classe "SimpleThings\EntityAudit\AuditReader" mais aucun service de ce type n'existe. Il ne peut pas être enregistré automatiquement car il provient d'un espace de noms racine différent.

Quand j'ajoute ceci dans mon services.yaml Cela fonctionne, mais je ne devrais pas avoir besoin de faire ceci:

SimpleThings\EntityAudit\AuditReader:
    alias: simplethings_entityaudit.reader

Des idées?

10
Ben

Dans Symfony 4.0, tout service qui ne spécifie pas sa visibilité est privé, https://github.com/symfony/symfony/pull/24238 .

Pour autant que je puisse voir, le service que vous mentionnez ne spécifie pas la visibilité: https://github.com/simplethings/EntityAuditBundle/blob/1.0/src/SimpleThings/EntityAudit/Resources/config/auditable.xml # L23-L26 , c'est donc probablement la raison de votre exception.

Si simplethings_entityaudit.reader le service ne peut pas être câblé automatiquement (et c'est probablement parce qu'il utilise un service d'usine), vous pouvez l'injecter dans votre propre service en le référençant avec @simplethings_entityaudit.reader notation selon ceci: https://symfony.com/doc/current/service_container.html#services-manually-wire-args , quelque chose comme ceci:

services:
    My\Service:
        arguments:
            $auditReader: @simplethings_entityaudit.reader
4
Edi Modrić

Dans mon cas, l'erreur apparaît dans un test unitaire.

J'avais un seul service, qui ne pouvait pas être chargé dans les tests (Symfony 4.2) tandis que tous les autres services de mon projet fonctionnaient bien.

J'ai vidé le cache, mais cela n'a pas aidé. J'ai ensuite créé un contrôleur simple avec une route et injecté le service comme paramètre de méthode. Ensuite, le service a également fonctionné dans mon test.

Conclusion: si vous avez un test unitaire et que vous souhaitez tester votre service, vous devez également fournir un contrôleur où le service est injecté, sinon il n'est pas disponible dans le conteneur du service de test. Une configuration de service explicite peut également aider.

4
Hendrik Pilz