Symfony 3.3服务自动配置

时间:2017-06-18 15:04:01

标签: php symfony dependency-injection autowired symfony-3.3

我正在尝试迁移到symfony 3.3并使用新功能autowire / autoconfigure服务:

所以在services.yml中我有:

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}'

我将我的枝条扩展名声明为:

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

和此服务的构造函数:

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;
}

似乎一切都好,但我收到了这个错误:

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

并且不知道如何解决它。

2 个答案:

答案 0 :(得分:4)

我有相同的错误消息,但是由不同的bug引起。也许有人会觉得这很有用。

我在service.yml中的初始配置是:

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

我收到了这个错误:

  

无法自动服务" AppBundle \ Service \ MyService":参数   " $ foobar的"方法" __ construct()"必须有类型提示或给出   一个明确的值。

然后几个小时后我找到了解决方案:

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

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

答案 1 :(得分:2)

所以问题是我试图使用AppBundle中的services.yml,如果我理解正确,从bundle中导入服务的旧样式不能用于自动装配/自动配置,因为我们需要重写load()AppExtension开始使用类型提示的方法。所以我已将我的所有服务替换为app/config/services.yml,这对我很有帮助。