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?
@config.factory
Dienst 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.Antworten:
Sie können eine Fabrik für Ihren
app.mailer
Service 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.quelle
Mailer
Klasse einen anderen Dienst hinzufügen? ?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.
quelle
Sie können einen Factory- oder Konfigurator-Service verwenden, der weiß, wie die Config-Factory funktioniert usw., wodurch Ihr Service von der Config-Factory entkoppelt bleibt. Der HTTP-Client im Kern verfügt über einen Konfigurator, wenn Sie ein Beispiel benötigen. Dokumente finden Sie unter https://symfony.com/doc/current/service_container/configurators.html#using-the-configurator .
quelle