symfony v3.4无法猜测自动装配

时间:2018-05-03 12:07:55

标签: php symfony

使用自动装配功能时,Symfony v3.4无法猜测参数。

  无法自动服务" AppBundle \ Service \ MyServiceConfig":参数" $ key"方法" __ construct()"没有类型提示,您应该显式配置其值。

我还明确定义了参数,但它仍然不起作用,参数类型为string,长度为136个字符。

services:
     app.myservice.config:
         class: AppBundle\Service\MyServiceConfig
         public: true
         arguments: ["%app_key%"] #defined in parameter.yml

    app.myservice
         class: AppBundle\Service\MyService
         public: true
         arguments: ["@app.myservice.config"]

哪种方法非常好我在调用服务时可以看到预期的结果。

但是当我写AppExtension时,我得到了上述错误:

app.twig.my_app_extension:
    class: AppBundle\Twig\MyAppExtension
    arguments: [ "@app.myservice" ]
    tags:
       - { name: twig.extension }

所以我明确定义了参数

app.myservice.config:
     class: AppBundle\Service\MyServiceConfig
     public: true
     arguments: 
         $key:  "%app_key%" #defined in parameter.yml

它仍然不起作用

这就是MyServiceConfig类的样子:

 class MyServiceConfig implements MyServiceConfigInterface {

    /**
     * @var string
     */
    private $key;

   public function __construct($key){
    $this->key= $key;
 }
}

MyAppExtension类:

/**
 * The MyAppExtension class
 */
 class MyAppExtension extends \Twig_Extension
  {
  /**
   * @var MyServiceConfigInterface $key
   */
  private $key;

  public function __construct(MyServiceConfigInterface $key){
    $this->key= $key;
  }
}

提供的解决方案here没有任何帮助,因为我在app/config/services.yml内有我的service.yml

1 个答案:

答案 0 :(得分:1)

所以我很无聊将app / config / services.yml文件更新为:

#app.myservice.config:
AppBundle\Service\MyServiceConfig:
#    public: true
    arguments:
        $key: "%key%"

#app.myservice:
#    class: AppBundle\Service\MyAppService
#    arguments: ["@app.myservice.config"]
#    public: true

针对MyAppServiceInterface的TwigExtension类型提示。因此,autowire在容器中查找id为MyAppServiceInterface的服务。它根本不查看类参数。现在,在您的情况下,您可以使用MyAppService实现您的界面,并且autowire非常智能,可以识别您的界面只有一个实现。

如果您决定添加其他实现,则可以更加健壮地将您的实现显式别名接口,以防止出现问题。在这种情况下并非绝对必要。

AppBundle\Service\MyServiceConfig:
    { $key: "%key%" } # Just showing off here

AppBundle\Service\MyServiceConfigInterface: '@AppBundle\Service\MyServiceConfig'

还有一个不相关的事情:不要打电话给你的枝条扩展类AppBundleExtension。好像你正在使用bundle扩展来混合twig扩展。两个不同的概念。没关系,但可能会让人感到困惑。