【问题标题】:Symfony4 Inject env variable and autowire error "Cannot autowire service"Symfony4 注入环境变量和自动装配错误“无法自动装配服务”
【发布时间】:2018-12-25 23:05:28
【问题描述】:

我正在尝试创建一个接收 .env 文件中定义的两个参数的服务。

Symfony 抛出下一个错误:

无法自动装配服务 “App\Modules\Sales\Infrastructure\Persistence\Http\HttpSalesRepository”: 方法“__construct()”的参数“$credentials”是类型提示的“ar
ray",你应该明确地配置它的值。

这是我的 service.yml 文件:

parameters:

services:
    _defaults:
        autowire: true      # Automatically injects dependencies in your services.
        autoconfigure: true # Automatically registers your services as commands, event subscribers, etc.

    App\:
        resource: '../src/*'
        exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}'

    App\Controller\:
        resource: '../src/Controller'
        tags: ['controller.service_arguments']

imports:
    - { resource: "../src/Modules/Sales/Infrastructure/DependencyInjection/sales_module.yml" }

这是 sales_module.yml 中的代码:

services:
  module_sales.http.sales.repository:
    public: false
    class: App\Modules\Sales\Infrastructure\Persistence\Http\HttpSalesRepository
    arguments: ["%env(json:CREDENTIALS)%", "%env(json:TAGS)%"]

这是 HttpSalesRepository 类

class HttpSalesRepository implements SalesRepository
{
    private $credentials;
    private $tags;

    public function __construct(array $credentials, array $tags)
    {
        $this->credentials = $credentials;
        $this->tags = $tags;
    }
    ...
 }

这是 .env 文件:

###> symfony/framework-bundle ###
APP_ENV=dev
APP_SECRET=xxxxxx
###< symfony/framework-bundle ###

###> doctrine/doctrine-bundle ###
DATABASE_URL=mysql://xxx:yyy@mysql:3306/db
###< doctrine/doctrine-bundle ###

###> application/variables ###
CREDENTIALS='{"username":"email@test.com","password":"secretpass"}'
TAGS='["tag1","tag2","tag3"]'
###< application/variables ###

有什么想法吗?

【问题讨论】:

    标签: autowired symfony4


    【解决方案1】:

    您可以命名服务参数以将参数名称与值显式匹配,而不仅仅是参数列表:

    services:
      module_sales.http.sales.repository:
        public: false
        class: App\Modules\Sales\Infrastructure\Persistence\Http\HttpSalesRepository
        arguments: 
          $credentials: "%env(json:CREDENTIALS)%"
          $tags: "%env(json:TAGS)%"]
    

    【讨论】:

      【解决方案2】:

      不是最好的选择,但在我找到最终解决方案时是一种工作。如果我在 config/services.yaml 中定义服务,则变量完美地传递给服务。

      App\Modules\Sales\Infrastructure\Persistence\Http\HttpSalesRepository:
          public: false
          arguments: ["%env(json:AMAZON_AFFILIATES_CREDENTIALS)%", "%env(json:AMAZON_AFFILIATES_TAGS)%"]
      

      欢迎任何其他解决方案。

      【讨论】:

        猜你喜欢
        • 2023-04-08
        • 1970-01-01
        • 1970-01-01
        • 2016-08-17
        • 2013-09-27
        • 1970-01-01
        • 2014-07-08
        • 2018-11-02
        相关资源
        最近更新 更多