Wofür ist die öffentliche statische Funktion create () in Plugins gedacht?


7

Manchmal stoße ich auf eine öffentliche statische Funktion, die mit Argumenten in Plugin-Klassen erstellt wird.

Zum Beispiel können wir hier https://www.sitepoint.com/tutorial-on-using-drupal-8-plugin-derivatives-effectively/ sehen.

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

Könnten Sie mir klarstellen, wofür die Funktion ist? Was soll es tun und wo wird es verwendet?

Antworten:


7

create () ist eine Factory-Methode für die Abhängigkeitsinjektion.

Plugins, die implementieren, ContainerFactoryPluginInterfacewerden von create()der Plugin-Klasse instanziiert :

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);
}

5

Dies ist die statische Methode, mit der Drupal Core das Plugin erstellt. (Siehe zum Beispiel die Dokumentation für SystemMenuBlock::create().)

Drupal Core instanziiert kein Plugin mit new PluginClass(), aber PluginClass::create(). Dadurch kann die Klasse, die das Plugin implementiert, eine zuvor erstellte Instanz zurückgeben.
Der andere Vorteil ist, dass die Signatur der Plugin-Konstruktoren variieren kann, ohne Drupal Probleme zu bereiten. Dies erfordert lediglich, dass die create()Methode einer Plugin-Klasse immer dieselbe Signatur hat.

Es ist das gleiche Muster, das für Drupal-Dienste verwendet wird.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.