从2.8升级到Symfony 3.4之后,我试图摆脱有关使用容器中服务的警告。一个挂断的是我的控制器全部从抽象控制器扩展而来,该抽象控制器需要访问独占记录器。我决定对我的控制器使用自动接线,并在基本控制器中添加了一个构造函数,该构造函数将LoggerInterface $logger
作为唯一参数。为了一次进行配置,我在services.yml的bind部分下添加了$ logger变量和对logger服务的引用。
但是,我不断收到错误消息:
Unused binding "$logger" in service "security.authentication.failure_handler.secured_area.form_login"
我相信只有在没有服务具有该变量名称的构造函数参数的情况下,才会出现此错误。现在我知道我的控制器都在抽象类中具有此功能,并且属于我的其他一些服务的一部分,因此这似乎是错误的。如何摆脱这个错误?
这是我的services.yml的样子:
services:
_defaults:
autowire: true
autoconfigure: true
public: false
bind:
$logger: "@logger"
$env: "%sys_env%"
_instanceof:
\Twig_Extension:
tags: ['twig.extension']
AppBundle\:
resource: '../../../../../../src/AppBundle/{Controller,Service,Twig}/*'
exclude: '../../../../../../src/AppBundle/Service/Exception/*'
# SECURITY ########################################################################
security.authentication.failure_handler:
class: AppBundle\Security\AuthenticationFailureHandler
autowire: false
arguments: ["@http_kernel", "@security.http_utils", {}, "@app.service.security", "@doctrine.orm.entity_manager", "@logger"]
tags:
- { name: 'monolog.logger', channel: 'security' }
我注意到在security.authentication.failure_handler
中我引用了我的一项服务:app.service.security
。我忘了在下面声明这一点,所以我在services.yml中添加了以下内容:
app.service.security:
class: AppBundle\Service\SecurityService
摆脱了记录器错误,但是现在我看到有关$ env字符串变量的错误:
Unused binding "$env" in service "security.authentication.failure_handler.secured_area.form_login".
我担心错误消息不是真正的错误,这是一条红色的鲱鱼。绑定选项似乎有点不稳定。任何建议表示赞赏...
我决定摆脱config的bind和instanceof,而是手动设置值,但是现在出现错误:Cannot autowire service "app.service.security": argument "$sysInfoService" of method "AppBundle\Service\SecurityService::__construct()" references class "AppBundle\Service\SystemInfoService" but no such service exists. You should maybe alias this class to the existing "app.service.system_info" service.
奇怪的是,我认为我确实在执行错误所建议的操作;我为自动接线服务添加了别名:
app.service.system_info:
class: AppBundle\Service\SystemInfoService
app.service.security:
class: AppBundle\Service\SecurityService
我确实有一些服务,我用autowired: false
手动声明了这些服务,以便手动设置参数。我认为应该没关系;您应该能够在服务容器中同时存在自动接线和手动接线,对吗?