Symfony4 Внедрить переменную env и ошибку autowire "Cannot autowire service" - PullRequest
0 голосов
/ 26 декабря 2018

Я пытаюсь создать службу, которая получает два параметра, определенных в файле .env.

Symfony выдает следующую ошибку:

Невозможно автоматически подключить службу "App \ Modules \"Sales \ Infrastructure \ Persistence \ Http \ HttpSalesRepository ": аргумент" $ credentials "метода" __construct () "является подсказкой типа" 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 ###

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 01 января 2019

Не лучший вариант, но это обходной путь, пока я не найду окончательное решение.Если я определю службу в config / services.yaml, переменные будут полностью переданы службам.

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

Будет приветствоваться любое другое решение.

0 голосов
/ 26 декабря 2018

Вы можете присвоить служебным аргументам явное соответствие имени параметра значению, а не просто иметь список аргументов:

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)%"]
...