从 2.8 升级到 Symfony 3.4 后,我试图摆脱有关使用容器服务的警告。一个挂断是我的控制器都从一个需要访问独白记录器的抽象控制器扩展而来。我决定为我的控制器使用 autwiring,并在基本控制器中添加了一个构造函数,它具有 aLoggerInterface $logger
作为唯一参数。为了尝试配置一次,我添加了 $logger 变量,并在 services.yml 的绑定部分下添加了对记录器服务的引用。
但是,我不断收到错误消息:
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' }
更新 1:
我注意到在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".
我担心错误消息不是真正的错误,这是一个红鲱鱼。绑定选项似乎有点不稳定。任何建议表示赞赏...
更新 2:
我决定摆脱 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
以便手动设置参数。我认为应该没问题;您应该能够在服务容器中同时存在自动布线和手动布线,对吗?