カスタムモジュール(my_module)があります。このモジュール内には、カスタムクラス(MyClass)があり、ここでDrupalサービス(file_system)を使用します。
これは私のコードです。
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のインスタンスでなければなりません。指定されていません
私のコードの何が問題になっていますか?
DIはそれより少し多くの労力を必要とします-クラスについてシステムに伝えていません。 DIコンテナは、あなたがnew MyClass()
を呼び出したことを認識していないため、関与できません。
Service を作成する必要があります。これは、他の利用可能なサービスに依存するようにすることができ、そのインスタンスは、すでに使用している静的create
メソッドパターンを使用してクラスに渡されます。
この場合、おそらくmymodule.services.ymlを提供して以下を追加するのと同じくらい簡単です:
my_service:
class: Drupal\my_module\MyClass
arguments: ['@file_system']
クラスをシステムに正しく登録すると、そのようなインスタンスが次のように表示されます(グローバル関数で必要な場合)。
$foo = Drupal::service('my_service');
または、コンテナ対応クラスで使用している場合は、他のサービスと同じように挿入できます。