Settings.phpで接続として定義されているいくつかの異なる外部データベースからデータをプルするカスタムモジュールがあります。現在のセットアップには、DataAccessと呼ばれる作成したサービスが注入された一連のコントローラーが含まれています。私のDataAccessサービスには$schema
パラメーターを受け入れるいくつかのメソッドがあり、これに基づいて毎回以下を使用します。
$connection = Database::getConnection('default', $schema);
次に、このセットアップで必要に応じて各データベースにクエリを実行できます。 Drupalコンテナからサービスにデータベースを注入することを考えましたが、最初にそのサービスを取得するには、ControllerBaseのcreateメソッドのような基本クラスが必要になります。正しい方法は何でしょうか。これはコントローラではないので、これを行います-ここで別の基本クラスを使用しますか?Drupal 8開発に不慣れで、ベストプラクティスに従っていることを確認しようとしていますが、同時に時間私は物事を複雑にしたくありません。
何かアドバイス?
別の答えについてコメントしたように、ここでの答えはおそらくそうではありません。
データベースAPIは、サービスを使用するように完全に変換されていません。 https://www.drupal.org/node/18117 でかなり長い間それをやろうとしましたが、成功せず、他のものもしませんでした。
したがって、今のところ、静的メソッドを使用する必要があります。あなたができる最善のことは、ユニットテストを書くときにそれをモックすることを簡単にするためにそれをメソッドまたは別のサービスでラップすることです。
現時点では、このコードを使用してデータベースサービスを挿入しています。
*。services.yml
services:
onlyone:
class: Drupal\onlyone\OnlyOne
arguments: ['@entity_type.manager', '@database', '@language_manager']
Drupal\onlyone\OnlyOne
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Database\Connection;
use Drupal\Core\Language\LanguageManagerInterface;
/**
* {@inheritdoc}
*/
public function __construct(EntityTypeManagerInterface $entity_type_manager, Connection $connection, LanguageManagerInterface $language_manager) {
$this->entityTypeManager = $entity_type_manager;
$this->connection = $connection;
$this->languageManager = $language_manager;
}