Drupal 8butでDI依存関係を構成オブジェクトの値で初期化することは可能ですか?
たとえば、SoapClientは、呼び出されるときに WSDLの指定 を必要とします。使用している環境(test/prodなど)に応じて、異なるWSDL URLを持っています。
Services yamlファイルからこれを実行できることはわかっていますが、configオブジェクトから1つまたは複数の値を参照できる方法については読んでいません。
私の最終的な目標は、SoapClientのデコレーターまたはファクトリーを作成することですが、どちらがよいかわかりません。
編集:コードで更新。
インターフェース:
<?php
namespace Drupal\iana_netforum_auth\Factory;
use SoapClient;
interface SoapClientFactoryInterface {
/**
* Create a SoapClient.
*
* This method should prepopulate the SoapClient with values from our
* module configuration so it is ready to use.
*
* @return SoapClient
*/
public function create() : SoapClient;
}
工場:
<?php
namespace Drupal\iana_netforum_auth\Factory;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\iana_netforum_auth\Exception\NetforumException;
use SoapClient;
class SoapClientFactory implements SoapClientFactoryInterface {
public function __construct(ConfigFactoryInterface $config_factory) {
$this->configFactory = $config_factory;
}
public function create() : SoapClient {
$config = $this->configFactory->get('iana_netforum_auth.settings');
$arguments = [];
try {
if ($config->get('mode') == 'live') {
$endpoint = $config->get('live_endpoint');
}
else {
$endpoint = $config->get('dev_endpoint');
$arguments = [
'trace' => $config->get('enable_trace'),
'exceptions' => $config->get('enable_exceptions')
];
}
return new SoapClient($endpoint, $arguments);
}
catch (SoapFault $error) {
throw new NetforumException('Invalid WSDL endpoint specified.');
}
}
}
クラス:
class NetforumClient implements NetforumClientInterface {
protected $username;
protected $password;
protected $token;
protected $authorizationHeaders;
/**
* Drupal\Core\Config\ConfigFactoryInterface definition.
*
* @var \Drupal\Core\Config\ConfigFactoryInterface
*/
protected $configFactory;
/**
* Drupal\iana_netforum_auth\Factory\SoapClientFactoryInterface definition.
*
* @var \Drupal\iana_netforum_auth\Factory\SoapClientFactoryInterface
*/
protected $soapClient;
/**
* Class constructor.
*
* @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
* An instance of ConfigFactoryInterface.
* @param \Drupal\iana_netforum_auth\Factory\SoapClientFactoryInterface $soap_client_factory
* An instance of SoapClientFactoryInterface.
*/
public function __construct(ConfigFactoryInterface $config_factory, SoapClientFactoryInterface $soap_client_factory) {
$this->configFactory = $config_factory;
$this->soapClient = $soap_client_factory->create();
}
どの部分が正確に不明確かわかりません。 core.services.yamlには、config.factoryサービスを挿入して構成オブジェクトを読み取る多くの例があります。たとえば、次のようになります。
diff.formatter:
class: Drupal\Core\Diff\DiffFormatter
arguments: ['@config.factory']
そのためのコンストラクタは次のようになります。
/**
* Creates a DiffFormatter to render diffs in a table.
*
* @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
* The config factory.
*/
public function __construct(ConfigFactoryInterface $config_factory) {
$config = $config_factory->get('system.diff');
$this->leading_context_lines = $config->get('context.lines_leading');
$this->trailing_context_lines = $config->get('context.lines_trailing');
}
Configオブジェクトを取得したら、必要な構成を取得して、それをSoapClientコンストラクターに渡します。