symfony 在系统中从.env或ENV设置服务类

6tr1vspr  于 2022-11-25  发布在  其他
关注(0)|答案(2)|浏览(158)

我有symfony 4的设置
services.yml中,我配置了以下服务

MyCompany\Interfaces\QueueProducerInterface:
  class: MyCompany\Service\KafkaProducer
  arguments:
     $queueConfig: '@queue_config'

我想在我的.env文件中动态地更改设置,这样我就可以在以后根据env(dev,production)注入它......所以我尝试了如下操作:
.env为单位

QUEUE_DRIVER="MyCompany\Service\KafkaProducer"

现在是services.yaml

MyCompany\Interfaces\QueueProducerInterface:
#      class: MyCompany\Service\KafkaProducer
      class: '.%env(QUEUE_DRIVER)%'
      arguments:
         $queueConfig: '@queue_config'

但是当我运行composer update时,我得到一个容器错误

Script cache:clear returned with error code 1
!!
!!  In Compiler.php line 112:
!!
!!    Incompatible use of dynamic environment variables "QUEUE_DRIVER" found in p
!!    arameters.
!!
!!
!!  In AbstractRecursivePass.php line 123:
!!
!!    Invalid service "MyCompany\Interfaces\QueueProducerInterface": class ".%env(
!!    QUEUE_DRIVER)%" does not exist.
!!
!!

我如何解决这个问题?或者更好地说,我如何根据ENV动态地设置这个类的值。

lyfkaqu1

lyfkaqu11#

我通过在config/packages/dev/文件夹中创建一个services.yaml,并使用不同的设置'config/packages/prod/'解决了这个问题。

4uqofj5v

4uqofj5v2#

在较新版本的symfony中,您可以使用when@xxx语法和接口在单个services.yaml中执行此操作,如下所示:
例如:

parameters:
    my.nice.service.class: Some\NameSpace\RealServiceClass

when@dev:
    parameters:
        my.nice.service.class: Some\DevelHelper\RealServiceClass

Some\NameSpace\WorkerInterface:
    class: '%my.nice.service.class%'

在消费类中,只需在构造函数中键入Some\NameSpace\WorkerInterface接口的提示,它就会被正确注入。
当然,Some\NameSpace\WorkerInterface接口必须存在于代码中,并且RealServiceClassRealServiceClass都必须实现该接口。

相关问题