web-dev-qa-db-ja.com

データベース接続をカスタムサービスに挿入する方法は?

Settings.phpで接続として定義されているいくつかの異なる外部データベースからデータをプルするカスタムモジュールがあります。現在のセットアップには、DataAccessと呼ばれる作成したサービスが注入された一連のコントローラーが含まれています。私のDataAccessサービスには$schemaパラメーターを受け入れるいくつかのメソッドがあり、これに基づいて毎回以下を使用します。

$connection = Database::getConnection('default', $schema);

次に、このセットアップで必要に応じて各データベースにクエリを実行できます。 Drupalコンテナからサービスにデータベースを注入することを考えましたが、最初にそのサービスを取得するには、ControllerBaseのcreateメソッドのような基本クラスが必要になります。正しい方法は何でしょうか。これはコントローラではないので、これを行います-ここで別の基本クラスを使用しますか?Drupal 8開発に不慣れで、ベストプラクティスに従っていることを確認しようとしていますが、同時に時間私は物事を複雑にしたくありません。

何かアドバイス?

6
Ian Carnaghan

別の答えについてコメントしたように、ここでの答えはおそらくそうではありません。

データベースAPIは、サービスを使用するように完全に変換されていません。 https://www.drupal.org/node/18117 でかなり長い間それをやろうとしましたが、成功せず、他のものもしませんでした。

したがって、今のところ、静的メソッドを使用する必要があります。あなたができる最善のことは、ユニットテストを書くときにそれをモックすることを簡単にするためにそれをメソッドまたは別のサービスでラップすることです。

5
Berdir

現時点では、このコードを使用してデータベースサービスを挿入しています。

*。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;
  }
1