PreviousNext: Safely extending Drupal 8 plugin classes without fear of constructor changes

Planet Drupal - 3. November 2017 - 0:34
Share:

From time to time you may find you need to extend another module's plugins to add new functionality.

You may also find you need to alter the signature of the constructor in order to inject additional dependencies.

However plugin constructors are considered internal in Drupal's BC policy.

So how do you safely do this without introducing the risk of breakage if things change.

In this article we'll show you a quick trick learned from Search API module to avoid this issue.

by Lee Rowlands / 3 November 2017

So let's consider a plugin constructor that has some arguments.

Here's the constructor and factory method for Migrate's SQL map plugin

/**
   * Constructs an SQL object.
   *
   * Sets up the tables and builds the maps,
   *
   * @param array $configuration
   *   The configuration.
   * @param string $plugin_id
   *   The plugin ID for the migration process to do.
   * @param mixed $plugin_definition
   *   The configuration for the plugin.
   * @param \Drupal\migrate\Plugin\MigrationInterface $migration
   *   The migration to do.
   */
  public function __construct(array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration, EventDispatcherInterface $event_dispatcher) {
    parent::__construct($configuration, $plugin_id, $plugin_definition);
    $this->migration = $migration;
    $this->eventDispatcher = $event_dispatcher;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration = NULL) {
    return new static(
      $configuration,
      $plugin_id,
      $plugin_definition,
      $migration,
      $container->get('event_dispatcher')
    );
  }

As you can see, there are two additional dependencies injected beyond the standard plugin constructor arguments - the event dispatcher and the migration.

Now if you subclass this and extend the constructor and factory to inject additional arguments, should the base plugin change its constructor, you're going to be in trouble.

Instead, you can use this approach that Search API takes - leave the constructor as is (don't override it) and use setter injection for the new dependencies.

/**    * {@inheritdoc}    */   public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration = NULL) {     $instance = parent::create(       $container,       $configuration, $plugin_id,       $plugin_definition,       $migration     ); $instance->setFooMeddler($container->get('foo.meddler'); return $instance;   } /** * Sets foo meddler. */ public function setFooMeddler(FooMeddlerInterface $fooMeddler) { $this->fooMeddler = $fooMeddler; }

Because the signature of the parent create method is enforced by the public API of \Drupal\Core\Plugin\ContainerFactoryPluginInterface you're guaranteed that it won't change.

Thanks to Thomas Seidl for this pattern

Tagged Drupal 8, Plugins, OOP

Posted by Lee Rowlands
Senior Drupal Developer

Dated 3 November 2017

Comments

Comment by dawehner

Dated 3 November 2017

Nice!! Thank you for sharing it!

Pagination Add new comment

Sony bringt Roboterhund Aibo zurück

heise online Newsticker - 2. November 2017 - 19:30
Mit dem elektronischen Hund Aibo war Sony ein Pionier bei Robotern fürs Zuhause. Inmitten hoher Verluste zog der Konzern dann zum Leidwesen vieler Besitzer den Stecker. Doch jetzt gibt es eine neue Generation.

Apple TV 4K: Bildwiederholrate und HDR-Ausgabe künftig je nach Inhalt

heise online Newsticker - 2. November 2017 - 19:00
Das aktuell in der Beta-Phase befindliche tvOS 11.2 versetzt das Apple TV 4K in die Lage, die Videoausgabe an den gerade abgespielten Inhalt anzupassen.

"Wikitribune": Nachrichtenplattform von Jimmy Wales eröffnet

heise online Newsticker - 2. November 2017 - 19:00
Der Wikipedia-Gründer hat mit "Wikitribune" ein Nachrichtenportal eröffnet, das neutral, objektiv und mehrsprachig berichten soll. Bislang sind die Unterschiede zur Konkurrenz aber nicht sehr groß. Offen bleibt, ob Spenden die Seite finanzieren können.

macOS 10.12 und 10.11: KRACK-Lücke gestopft, Loch im Schlüsselbund bleibt

heise online Newsticker - 2. November 2017 - 18:00
Apple hat ein Sicherheitsupdate für Sierra und El Capitan veröffentlicht, in dem ein vieldiskutiertes WLAN-Problem behoben wurde. Ein anderer schwerwiegender Fehler wurde hingegen offenbar nicht angegangen.

Gegen Nuklear-Terrorismus: Sensorik warnt vor strahlenden Gefahren

heise online Newsticker - 2. November 2017 - 17:30
Deutsche Wissenschaftler wollen Terroranschläge mit sogenannten schmutzigen Bomben früherkennen.

Apple aktualisiert Betriebssysteme von Apple Watch und Apple TV

heise online Newsticker - 2. November 2017 - 17:30
Neben macOS 10.13.1 und iOS 11.1 stehen nun auch tvOS 11.1 und watchOS 4.1 zum Download bereit – mit neuen Funktionen und Fehlerbehebungen.

"Mission Breitband" in Niedersachsen: Alle Landkreise am Start

heise online Newsticker - 2. November 2017 - 17:00
Der Breitbandausbau ist ein wichtiges Zukunftsthema, die bisher gesetzten Ziele zum Ausbau werden aber mit großer Wahrscheinlichkeit verfehlt. Das liegt unter anderem an einer unübersichtlichen Förderstruktur, heißt es in Niedersachsen.

iPhone X: Erste Kurztests zumeist positiv

heise online Newsticker - 2. November 2017 - 16:30
Apple hat Medien diesmal wenig Zeit gegeben, sein Top-Smartphone auszuprobieren. Wer es bekommen hatte, konnte es zumeist nur einen Tag lang checken. Viel Lob gab's für das Display. Face ID funktioniere gut, lässt sich aber vom "Evil Twin" austricksen.

Straße der Zukunft heilt sich selbst und liefert Strom

heise online Newsticker - 2. November 2017 - 16:30
Bei Köln ist ein Testgelände entstanden, das aufhorchen lässt. Ingenieure erproben dort die Straßen von morgen – leicht zu reparieren und beheizt.

#heiseshow, live ab 12 Uhr: Großer Umbau bei Ubuntu – Wie geht es jetzt weiter?

heise online Newsticker - 2. November 2017 - 16:00
Das jüngste Update für Ubuntu brachte nicht nur die Abkehr vom Unity-Desktop, sondern weitere erhebliche Veränderungen. Was das für die Nutzer bedeutet und über die Herangehensweise von Canonical aussagt, besprechen wir in der #heiseshow.

Google Meet: Hardware-Paket für Googles Hangout-Messaging in Unternehmen

heise online Newsticker - 2. November 2017 - 16:00
Unter dem Namen Meet hat Google neue Hardware für seinen Kommunikationsdienst Hangouts präsentiert. Neben einer Chromebox ist auch ein neuer Touchscreen-Controller enthalten, mit dem Nutzer alle Funktionen aufrufen können.

US-Wahlmanipulation: Facebook, Google und Twitter äußern sich vor US-Senat

heise online Newsticker - 2. November 2017 - 16:00
Facebook, Google und Twitter müssen dem US-Senat Rede und Antwort stehen, ob und wie über ihre Plattformen aus dem Ausland Einfluss auf die Wahl genommen wurde. Eine Einflussnahme soll es gegeben haben, Gegenmaßnahmen werden in Zweifel gezogen.

Abwehr von staatlichen Hackern: Kanada schützt sich besser

heise online Newsticker - 2. November 2017 - 16:00
2% der fremden Staaten zugeordneten Angriffe auf IT-Systeme der kanadischen Regierung waren 2015 erfolgreich. Zwei Jahre davor waren es noch dreimal so viele gewesen.

macOS 10.13.1: Erstes Update für High Sierra

heise online Newsticker - 2. November 2017 - 16:00
Mit Version 10.13.1 bügelt Apple eine Reihe an Fehlern und Problemen im erst wenige Wochen alten Mac-Betriebssystem High Sierra aus.

Apple stellt iOS 11.1 zum Download bereit

heise online Newsticker - 2. November 2017 - 15:30
Das Update für iPhones und iPads soll störende Fehler ausräumen und die Sicherheit verbessern – unter anderem die WLAN-Lücke KRACK stopfen. Außerdem bringt es diverse neue Emoji mit.

HMD stellt Billig-Smartphone Nokia 2 vor

heise online Newsticker - 2. November 2017 - 15:00
HMD, der Inhaber der Marke Nokia, hat mit dem "Nokia 2" ein Android-Smartphone für unter 100 € vorgestellt. Mit seinem einem 5-Zoll-Display und 8 GByte Speicher ist es in Europa vor allem als Zweit-Gerät interessant.

Rekordergebnis trotz Führungskrise bei Samsung

heise online Newsticker - 2. November 2017 - 15:00
Beim koreanischen Elektronik-Hersteller läuft in der Führungsetage nicht alles nach Plan. Der Vizevorsitzende des Aufsichtsrats sitzt im Gefängnis, der Leiter der Halbleitersparte hört auf. Finanziell ist Samsung aber erfolgreich wie nie zuvor.

Jamaika-Sondierer wollen Gigabitnetz, modernes Datenrecht und Videoüberwachung

heise online Newsticker - 2. November 2017 - 15:00
CDU/CSU, FDP und Grüne haben sich bei ihren Sondierungsgesprächen auf erste Punkte in den Bereichen Digital, Inneres und Bildung verständigt. Streitfragen wie die Vorratsdatenspeicherung oder Staatstrojaner sind noch offen.

ICANN-Regierungsbeirat wählt Ägypterin als Vorsitzende

heise online Newsticker - 2. November 2017 - 14:30
Der ICANN-Regierungsrat wird künftig von Manal Ismail geleitet, einer ägyptischen Informatikerin.