尝试将记录器绑定到Symfony 3.4中的自动装配控制器构造器时发生未使用的绑定错误

时间:2019-02-27 19:51:51

标签: symfony symfony-3.4 symfony3.x symfony-dependency-injection

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

更新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:

我决定摆脱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手动声明了这些服务,以便手动设置参数。我认为应该没关系;您应该能够在服务容器中同时存在自动接线和手动接线,对吗?

0 个答案:

没有答案