web-dev-qa-db-ja.com

プラグインのパブリック静的関数create()とは何ですか?

プラグインクラスで引数を指定して関数public static function createに遭遇することがあります。

たとえば、ここ https://www.sitepoint.com/tutorial-on-using-drupal-8-plugin-derivatives-effectively/ 確認できます。

public static function create(ContainerInterface $container, $base_plugin_id) {
    return new static(
      $container->get('entity.manager')->getStorage('node')
    );
  }

明確にしていただけませんか、機能は何ですか?それは何をすべきか、どこで使用されますか?

7
Yakimkin Roman

create()は依存関係注入のための factory method です。

ContainerFactoryPluginInterfaceを実装するプラグインは、プラグインクラスのcreate()によってインスタンス化されます。

ContainerFactory :: createInstance

public function createInstance($plugin_id, array $configuration = []) {
  ...
  // If the plugin provides a factory method, pass the container to it.
  if (is_subclass_of($plugin_class, 'Drupal\Core\Plugin\ContainerFactoryPluginInterface')) {
    return $plugin_class::create(\Drupal::getContainer(), $configuration, $plugin_id, $plugin_definition);
  }

  // Otherwise, create the plugin directly.
  return new $plugin_class($configuration, $plugin_id, $plugin_definition);
}
7
4k4

これは静的メソッドですDrupalコアがプラグインを作成するために使用します(たとえば、 SystemMenuBlock::create() のドキュメントを参照してください)。

Drupalコアはnew PluginClass()ではなくPluginClass::create()でプラグインをインスタンス化しません。これにより、プラグインを実装するクラスは、以前に作成されたインスタンスを返すことができます。
他のproは、プラグインコンストラクターのシグネチャがDrupalに問題を与えることなく変更できることで、create()常に同じ署名を持つプラグインのクラスのメソッド。

これは、Drupalサービスに使用されるパターンと同じです。

5
kiamlaluno