如何将配置值注入服务?


8

在Symfony 2中,定义服务时,可以通过使用%parameter.name%字符串引用配置参数来注入配置参数。例如:

services:
  app.mailer:
    class:        AppBundle\Mailer
    arguments:    ['%app.mailer.transport%']

但是,将配置值注入服务的正确Drupal 8方法是什么?当然,我不想\Drupal::config()在服务类中使用。每次引用服务时传递配置值也没有太大意义。

我知道我可以注入config服务本身,然后从中获取配置值,但是由于我的服务本身知道如何从配置服务中读取数据,因此这看起来有些cr脚。例如:

# 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');
  }
}

还有其他方法吗?


1
D8方法是使用@config.factory服务从配置服务获取配置。这是因为配置服务可能会被覆盖,而不必从同一位置获取其配置值。
mradcliffe

Answers:


7

您可以使用工厂进行app.mailer服务。工厂负责检索服务的配置。该服务可以保持与配置服务的分离,并且不需要知道配置参数的命名方式。

services:
  app.mailer:
    class:       Drupal/mail_module/Mailer
    factory:      Drupal/mail_module/MailerFactory:create
    arguments:    ['@config.factory']


class MailerFactory {
  static function create($config) {
    return new Mailer($config->get('mail.config')->get('transport'));
  }
}

class Mailer {
  public function __construct($transport) {
    $this->mailTransport = $transport;
  }
}

1
我很困惑,因为我希望看到2个服务定义,类似于webomelette.com/more-complex-services-using-factories-drupal-8中给出的示例,在这个示例中,我如何向Mailer该类注入另一个服务?
米洛什·克鲁洛克(MilošKroulík),

3

这就是这样做的方式。配置可以在运行时更改,服务定义通常是持久的,繁琐的服务昂贵。假设您要用户更改配置。

如果不是,则可以使用参数,就像symfony示例一样。然后,您可以将配置放在sites / default中的services.yml中。但是您只能通过更改代码并重建容器来更改它。


好的,这基本上意味着服务需要知道如何配置参数,以便从config factory服务中获取它们。有点尴尬,使测试更加复杂。是否有某种用于测试目的的配置工厂存根?
SiliconMind

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.