Значение конфигурации доступа к пакету Symfony

#symfony #symfony5

#symfony #symfony5

Вопрос:

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

 <parameters>
    <parameter key="the.binary">CHANGE_THIS</parameter>
</parameters>

<services>
    <defaults public="true" />

    <service id="TheBundleTheService">
        <argument key="$env" type="string">%kernel.environment%</argument>
        <argument key="$binaryPath" type="string">%the.binary%</argument>
    </service>

</services>
 

Когда я отлаживаю:

bin/console debug:config mybinary

Я вижу, что конфигурация выглядит так, как я и ожидал:

 mybinary:
    binary: '/opt/somewhere/binary'
 

Как мне получить значение из конфигурации моего пакета в параметры, где находится CHANGE_THIS?

Комментарии:

1. Вы пытаетесь создать параметр с именем ‘the.binary’ со значением ‘/opt/somewhere/binary’? Обычно в вашем расширении DI вы просто получаете доступ к своему TheService и устанавливаете второй аргумент в двоичное значение вашей конфигурации. Параметр не задействован. Есть ли причина, по которой вам нужен параметр?

2. В расширении DI я могу dump($config) и вижу значение, которое я хочу, так что это хорошо. Я не уверен, как я получаю это значение в TheService __construct() ???

Ответ №1:

Вместо параметра вы обычно просто извлекаете значение из своей конфигурации и изменяете определение службы:

 class TheExtension extends Extension
{
    public function load(array $configs, ContainerBuilder $container)
    {
        $loader = new XmlFileLoader($container, new FileLocator(__DIR__ . "/../Resources/config"));
        $loader->load('services.xml');

        dump($configs);
        $binary = $configs[0]['binary']; // Cheating a bit, should build a config tree

        // Here is where you set the binary path
        $service = $container->getDefinition(TheService::class);
        $service->setArgument('$binaryPath',$binary);

    }
 

Удалите строку binaryPath из вашего services.xml досье.

Комментарии:

1. Я просто читаю другой пост SO, который как бы объясняет это, спасибо за разъяснение. Любопытно, я бы сохранил %kernel.environment%, потому что это не специфичная для пакета конфигурация?

2. Обычно да, однако во многих случаях у вас может вообще не быть определения в services.xml . Вместо изменения существующего определения службы вы можете создать определение службы полностью с нуля в расширении. Действительно ваш выбор. Я видел, как это делается обоими способами. В документах есть примеры, а в исходном коде их гораздо больше, хотя от некоторых расширений у вас закружится голова. MakerExtension для make bundle — хорошее место для начала.

3. Это много, чтобы переварить. Я весь день просматривал пакет twig … эта конкретная проблема поставила меня в тупик, еще раз спасибо за помощь!