#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 … эта конкретная проблема поставила меня в тупик, еще раз спасибо за помощь!