在 Symfony4 中使用 Symfony2 服务定义,为同一个类提供多个服务

问题描述

我在 Symfony2 中有以下服务定义

app.service_1:
   class: Symfony\Component\Lock\Store\RedisStore
   arguments:
       - '@snc_redis.default_cache'

app.service_2:
    class: Symfony\Component\Lock\Store\RedisStore
    arguments:
        - '@snc_redis.scheduler_cache'

现在我打算升级到Symnfony4,我需要将类路径作为服务名称

Symfony\Component\Lock\Store\RedisStore
   arguments:
       - '@snc_redis.default_cache'

Symfony\Component\Lock\Store\RedisStore
    arguments:
        - '@snc_redis.scheduler_cache'

这里的问题是它具有相同的名称,因为我们使用相同的类路径?我该如何解决?我可以使用具有不同参数的别名吗?

解决方法

您不需要更改定义。

当您需要从同一类创建多个服务时,使用 FQCN 作为标识符将不起作用。推荐使用完全限定的类名,这是一种很好的做法,但这不是强制性的。大多数情况下这是实用的,因为您可以省略 class 参数,而且您不需要为每个服务选择一个名称。

您的原始定义与 Symfony 4(或 5)完美兼容:

app.service_1:
   class: Symfony\Component\Lock\Store\RedisStore
   arguments:
       - '@snc_redis.default_cache'

app.service_2:
    class: Symfony\Component\Lock\Store\RedisStore
    arguments:
        - '@snc_redis.scheduler_cache'

我只是建议使用比 service_1service_2 更具描述性的标识符。

,

另一种方法是在 documentation

中使用类似解释的别名
services:
  Symfony\Component\Lock\Store\RedisStore:
    public: false
    arguments:
      - '@snc_redis.default_cache'

  app.service_1:
    alias: Symfony\Component\Lock\Store\RedisStore
    public: true

  Symfony\Component\Lock\Store\RedisStore:
    arguments:
      - '@snc_redis.scheduler_cache'
  app.service_2:
    alias: Symfony\Component\Lock\Store\RedisStore
    public: true

您还可以使用 bindautowire: true 作为参数。但是您在 services.yml 中的变量必须与在您的服务的构造函数中声明的变量相同。 看起来像这样:

services:
  # default configuration for services in *this* file
  _defaults:
    autowire: true      
    autoconfigure: true
    bind:
      $defaultCache: '@snc_redis.default_cache'
      $schedulerCache: '@snc_redis.scheduler_cache'

    Symfony\Component\Lock\Store\RedisStore:
      public: false

(或仅在您的服务声明中使用 bind)。

PS:在你的例子中要小心,你错过了课程路径后的 : :)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...