Symfony объединяет файлы конфигурации yaml и php - PullRequest
0 голосов
/ 12 июня 2018

В Symfony 4 я хотел бы объединить различные файлы конфигурации для служб.В следующем сценарии я пытаюсь импортировать службы из конфигурации php с именем services.php, а затем выполнить конфигурации других служб в файле yaml, который импортирует другие службы.

services.yaml

imports:
    - { resource: services.php }


services:

    _defaults:
        autowire: true      
        autoconfigure: true 
        public: false    

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

services.php

<?php

use Symfony\Component\DependencyInjection\Definition;

$definition = new Definition();

$definition
    ->setAutowired(true)
    ->setAutoconfigured(true)
    ->setPublic(false)
;

$this->registerClasses($definition, 'App\\', '../src/*', '../src/{Entity,Migrations,Tests}');

$container->getDefinition(\App\SomeClass::class)
    ->setArgument('$param', 'someValue');

Файл класса

class SomeClass
{
    public function __construct(string $param)
    {
         ...
    }

Я получаю следующую ошибку:

Невозможно автоматически подключить службу "App \ SomeClass": аргумент "$ param" метода "__construct ()" является подсказкой типа "string", вы должны явно указать его значение.

Кроме того, мне интересно, нужно ли мне перезаписыватьисходное определение _defaults (или другие, уже внесенные импортируемыми файлами) из yaml или I могут наследоваться.Не уверен, как все эти файлы объединяются.

1 Ответ

0 голосов
/ 12 июня 2018

Проблема в том, что вы регистрируете классы в src/* дважды, один раз в services.php и один раз в services.yaml.

Так что при первом запуске с services.php вы правильно определяетеclass и требуемый аргумент, то во втором запуске с services.yaml определение перезаписывается и снова теряет аргумент.

Минимальным решением было бы исключить SomeClass.php в services.yamlпоэтому он не будет зарегистрирован во второй раз:

App\:
    resource: '../src/*'
    exclude: '../src/{Entity,Migrations,Tests,Kernel.php,SomeClass.php}' # <- here I added SomeClass.php

Было бы лучше создать отдельное пространство имен, исключить каталог в YAML и зарегистрировать этот каталог только в PHP-config.

...