В Symfony 2 при определении службы можно вводить параметры конфигурации, ссылаясь на них со %parameter.name%
строками. Например:
services:
app.mailer:
class: AppBundle\Mailer
arguments: ['%app.mailer.transport%']
Но каков правильный подход Drupal 8 к внедрению значений конфигурации в сервисы? Конечно, я не хочу использовать \Drupal::config()
внутри класса обслуживания. Передача значений конфигурации каждый раз при обращении к услуге также не имеет особого смысла.
Я знаю, что могу внедрить сам сервис конфигурации, а затем получить от него значения конфигурации, но это выглядит немного глупо, так как сам мой сервис знает, как читать данные из сервиса конфигурации. Например:
# Yaml service configuration
services:
app.mailer:
class: mail_module\Mailer
arguments: ['@config.factory']
PHP
<?php
class Mailer {
public function __construct($config) {
$this->mailTransport = $config->get('mail.config')->get('transport');
}
}
Есть ли другой способ сделать это?
@config.factory
службы для получения конфигурации из службы конфигурации. Это связано с тем, что служба конфигурации может быть переопределена и не обязательно получать свои значения конфигурации из того же места.Ответы:
Вы можете использовать фабрику для вашего
app.mailer
обслуживания. Фабрика заботится о получении конфигурации для службы. Служба может оставаться отделенной от службы конфигурации, и ей не нужно знать, как называются параметры конфигурации.источник
Mailer
класс ?Это способ сделать это. Конфигурация может изменяться во время выполнения, определение службы обычно сохраняется, а повторное использование является дорогостоящим. Предполагая, что это конфигурация, которую вы хотите, чтобы пользователи изменили.
Если это не так, вы можете использовать параметры, как в примере с Symfony. Затем вы можете поместить свою конфигурацию в services.yml в sites / default. Но вы можете изменить его только путем изменения кода и перестройки контейнера.
источник
Вы можете использовать службу фабрики или конфигуратора, которая знает о том, как работает фабрика конфигураций и т. Д., Что позволяет отделить вашу службу от фабрики конфигураций. HTTP-клиент в ядре имеет конфигуратор, если вам нужен пример. См. Https://symfony.com/doc/current/service_container/configurators.html#using-the-configurator для документов.
источник