web-dev-qa-db-ja.com

カスタムクラスでの依存性注入

カスタムモジュール(my_module)があります。このモジュール内には、カスタムクラス(MyClass)があり、ここでDrupalサービス(file_system)を使用します。

これは私のコードです。

src/MyClass.php

namespace Drupal\my_module;

use Drupal\Core\File\FileSystem;

class MyClass {
  public function __construct(FileSystem $file_system) {
  }

  public static function create(ContainerInterface $container) {
    return new static(
      $container->get('file_system')
    );
  }
}

このクラスを(たとえばコントローラーで)インスタンス化すると、エラーが発生します。

$my_class = new MyClass();

TypeError:Drupal\my_module\MyClass :: __ construct()に渡される引数1は、Drupal\Core\File\FileSystemのインスタンスでなければなりません。指定されていません

私のコードの何が問題になっていますか?

7
CamelCode

DIはそれより少し多くの労力を必要とします-クラスについてシステムに伝えていません。 DIコンテナは、あなたがnew MyClass()を呼び出したことを認識していないため、関与できません。

Service を作成する必要があります。これは、他の利用可能なサービスに依存するようにすることができ、そのインスタンスは、すでに使用している静的createメソッドパターンを使用してクラスに渡されます。

この場合、おそらくmymodule.services.ymlを提供して以下を追加するのと同じくらい簡単です:

my_service:
    class: Drupal\my_module\MyClass
    arguments: ['@file_system']

クラスをシステムに正しく登録すると、そのようなインスタンスが次のように表示されます(グローバル関数で必要な場合)。

$foo = Drupal::service('my_service');

または、コンテナ対応クラスで使用している場合は、他のサービスと同じように挿入できます。

13
Clive