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?
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
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.