サービスに構成値を挿入する方法は?


8

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

これを行う他の方法はありますか?


1
D8アプローチは、@config.factoryサービスを使用して構成サービスから構成を取得することです。これは、構成サービスがオーバーライドされ、必ずしも同じ場所から構成値を取得するわけではないためです。
mradcliffe 2016年

回答:


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
webomelette.com/more-complex-services-using-factories-drupal-8に示されている例と同様に、2つのサービス定義が表示されると予想していたため、混乱しています。この例を考えると、別のサービスをMailerクラスに注入するには?
ミロシュKroulík

3

それはそれを行う方法です。構成は実行時に変更される可能性があり、サービス定義は通常永続化され、コストが高くなります。ユーザーが変更する構成であると想定します。

そうでない場合は、symfonyの例のようにパラメーターを使用できます。次に、sites / defaultのservices.ymlに構成を配置できます。ただし、コードを変更してコンテナを再構築することによってのみ変更できます。


つまり、これは基本的に、サービスが構成ファクトリサービスからパラメータを取得するために、構成パラメータの命名方法を知る必要があることを意味します。少し厄介で、テストがより複雑になります。テスト用の構成ファクトリスタブはありますか?
SiliconMind 2016年

3

構成ファクトリーがどのように機能するかを認識しているファクトリーまたは構成サービスを使用して、サービスを構成ファクトリーから切り離すことができます。例が必要な場合は、コアのHTTPクライアントにコンフィギュレーターがあります。ドキュメントについては、https://symfony.com/doc/current/service_container/configurators.html#using-the-configuratorを参照してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.