Wie füge ich Konfigurationswerte in Dienste ein?

8

In Symfony 2 können beim Definieren eines Dienstes Konfigurationsparameter eingefügt werden, indem auf sie mit %parameter.name%Zeichenfolgen verwiesen wird. Zum Beispiel:

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

Aber was ist der richtige Drupal 8-Ansatz, um Konfigurationswerte in Dienste einzufügen? Natürlich möchte ich nicht \Drupal::config()innerhalb einer Serviceklasse verwenden. Das Übergeben von Konfigurationswerten bei jeder Referenzierung eines Dienstes ist ebenfalls wenig sinnvoll.

Ich weiß, dass ich den Konfigurationsdienst selbst einspeisen und dann Konfigurationswerte von ihm abrufen kann, aber das sieht ein bisschen beschissen aus, da mein Dienst selbst weiß, wie man Daten vom Konfigurationsdienst liest. Zum Beispiel:

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

Gibt es eine andere Möglichkeit, dies zu tun?

SiliconMind
quelle
1
Der D8-Ansatz besteht darin, den @config.factoryDienst zu verwenden, um die Konfiguration vom Konfigurationsdienst abzurufen. Dies liegt daran, dass der Konfigurationsdienst möglicherweise überschrieben wird und seine Konfigurationswerte nicht unbedingt von derselben Stelle abgerufen werden.
mradcliffe

Antworten:

7

Sie können eine Fabrik für Ihren app.mailerService verwenden. Das Werk kümmert sich darum, die Konfiguration für den Dienst abzurufen. Der Dienst kann vom Konfigurationsdienst entkoppelt bleiben und muss nicht wissen, wie die Konfigurationsparameter benannt sind.

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;
  }
}
Pierre Buyle
quelle
1
Ich bin verwirrt, weil ich erwartet habe, dass zwei Dienstdefinitionen angezeigt werden , ähnlich den Beispielen in webomelette.com/more-complex-services-using-factories-drupal-8. Wie kann ich in diesem Beispiel der MailerKlasse einen anderen Dienst hinzufügen? ?
Miloš Kroulík
3

So macht man das. Die Konfiguration kann sich zur Laufzeit ändern, die Dienstdefinition wird normalerweise beibehalten und das erneute Erstellen ist teuer. Angenommen, es ist die Konfiguration, die Benutzer ändern sollen.

Ist dies nicht der Fall, können Sie Parameter wie im Symfony-Beispiel verwenden. Anschließend können Sie Ihre Konfiguration in services.yml in sites / default einfügen. Sie können es jedoch nur ändern, indem Sie den Code ändern und den Container neu erstellen.

Berdir
quelle
OK, dies bedeutet im Grunde, dass ein Dienst wissen muss, wie Konfigurationsparameter benannt werden, um sie vom Konfigurations-Factory-Service zu erhalten. Ein bisschen umständlich und macht das Testen komplizierter. Gibt es eine Art Config Factory Stub zu Testzwecken?
SiliconMind