使用自动装配功能时,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
答案 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扩展。两个不同的概念。没关系,但可能会让人感到困惑。