2017-06-18 1 views
4

Je suis en train de migrer vers symfony 3.3 et d'utiliser de nouveaux services fonction autowire/autoconfigure:Symfony 3.3 Services autoconfiguration

Donc services.yml j'ai:

services: 
    _defaults: 
     autowire: true 
     autoconfigure: true 
     public: false 

    # makes classes in src/AppBundle available to be used as services 
    AppBundle\: 
     resource: '../../src/AppBundle/*' 
     # you can exclude directories or files 
     # but if a service is unused, it's removed anyway 
     exclude: '../../src/AppBundle/{Entity,Controller,DQL,Form/DataTransformer,Repository}' 

Je déclare mon extension de brindille comme:

AppBundle\Twig\ImageExtension: 
     arguments: 
      $env: "%kernel.environment%" 

et constructeur pour ce service:

public function __construct(TokenStorage $token, UserRepository $userRepository, RedisCacheService $cache, string $env) 
{ 
    $this->env = $env; 
    $this->user = $token->getToken() ? $token->getToken()->getUser() : false; 
    $this->userRepository = $userRepository; 
    $this->cache = $cache; 
} 

semble que tout est ok, mais je suis obtenir cette erreur:

(1/1) AutowiringFailedException 
Cannot autowire service "AppBundle\Twig\ImageExtension": argument "$env" of method "__construct()" must have a type-hint or be given a value explicitly. 

et ont aucune idée de comment y remédier.

+1

Hélas! , autowire ne fonctionne qu'avec les classes. Aucune chaîne ou entier. Vous pourriez faire une classe qui enveloppe $ env mais toute cette mode autowire ne va pas durer. https://stackoverflow.com/questions/44387103/symfony3-3-autowire-a-controller-with-scalar-argument – Cerad

+1

@kRicha ne parle pas d'autowiring l'argument 'env', il parle de sa configuration qui ne le fait pas travail. Basé sur [la documentation officielle sur le câblage manuel] (http://symfony.com/doc/current/service_container.html#manually-wiring-arguments), sa configuration semble correcte. @kRicha: Êtes-vous sûr de mettre à jour vos dépendances Symfony jusqu'à 3.3+? –

+0

@ NoémiSalaün c'est vrai – kRicha

Répondre

1

Donc problème était dans le cas que je tentais d'utiliser services.yml de AppBundle, si je comprends bien, style ancien des services de l'importation des paquets ne fonctionne pas avec autowiring/auto-configuration car nous avons besoin de réécrire load() méthode de AppExtension utiliser des astuces de type. J'ai donc remplacé tous mes services par app/config/services.yml et cela m'aide.

+0

J'ai un problème très similaire, mais je ne comprends pas ce que vous avez fait exactement. Pouvez-vous s'il vous plaît expliquer la réponse un peu plus? Merci. – DamirR

+0

@DamirR hey, juste essayer de déplacer la configuration de service.yml (par exemple AppBundle) à service.yml dans app/config – kRicha

+0

merci pour une réponse rapide. Mon service.yml était dans 'app/config /' tout le temps, et ça ne fonctionnait toujours pas. En attendant, j'ai trouvé la solution à mon problème. Je ne parviens pas à formater le bloc de code multiligne dans le commentaire, donc je l'ajouterai comme réponse. J'espère que cela ne vous dérange pas. – DamirR

2

J'ai eu le même message d'erreur, mais causé par un bogue différent. Peut-être que quelqu'un trouvera cela utile.

Ma config initiale était service.yml:

app.my_service: 
    class: 'AppBundle\Service\MyService' 
    arguments: 
     $foobar: 'some value for foobar' 
    public: true 

Et je recevais cette erreur:

Cannot autowire service "AppBundle\Service\MyService": argument "$foobar" of method "__construct()" must have a type-hint or be given a value explicitly.

Puis quelques heures plus tard, je trouve la solution:

AppBundle\Service\MyService: 
    arguments: 
     $foobar: 'some value for foobar' 

app.my_service: 
    alias: AppBundle\Service\MyService 
    public: true