Heim > Backend-Entwicklung > PHP-Tutorial > Tutorial über die Verwendung von Drupal 8 -Plugin -Derivaten effektiv

Tutorial über die Verwendung von Drupal 8 -Plugin -Derivaten effektiv

Christopher Nolan
Freigeben: 2025-02-16 11:26:12
Original
999 Leute haben es durchsucht

Tutorial über die Verwendung von Drupal 8 -Plugin -Derivaten effektiv

Key Takeaways

  • Plugin-Derivate in Drupal 8 ermöglichen die dynamische Deklaration mehrerer Instanzen desselben Plugins, wodurch die Benutzerkonfiguration in Plugins verwandelt wird.
  • Deriver -Klassen werden verwendet, um eine Liste von Plugin -Definitionen bereitzustellen, die auf dem anfänglichen Plugin basieren, jedoch leicht unterschiedliche Konfigurations- oder Definitionsdaten aufweisen.
  • Der DerivatediscoveryDecorator im Plugin -Manager wird zum Abrufen von Derivaten verwendet, auf der Suche nach einer Ausleitungsklasse für jedes Plugin und nach der Liste.
  • Während Plugin -Derivate ein leistungsstarkes Werkzeug sind, können sie komplex sein, insbesondere für Entwickler, die neu in Drupal oder nicht mit seinem Plugin -System vertraut sind. Sorgfältiges Management und Tests sind erforderlich, da Änderungen am Basis -Plugin alle seine Derivate beeinflussen können.

In einem früheren Tutorial haben wir uns das Drupal 8 -Plugin -System angesehen und wie wir unseren eigenen benutzerdefinierten Plugin -Typ erstellen. Wir haben gesehen, dass ein Großteil der über _info -Hooks in Drupal 7 deklarierten Funktionalität durch diese Plugins ersetzt wurde. Unser Anwendungsfall war sehr grundlegend und ermöglichte es, dass jeder Instanz über eine neue Plugin -Klasse und das zugehörige Formular manuell deklariert wird.

.

Tutorial über die Verwendung von Drupal 8 -Plugin -Derivaten effektiv

Aber was ist, wenn wir solche Instanzen brauchten dynamisch dynamisch von einigen Faktoren, die außerhalb unseres kleinen Subsystems extern sind? Wenn Sie beispielsweise _info -Hooks in Drupal 7 deklarieren, können wir eine Liste von etwas erhalten, über sie schauen und ein neues Element im zurückgegebenen Array für jedes einzelne etwas

deklarieren. Das Menüsystem erledigt dies, um einen neuen Block für jedes Menü bereitzustellen, das entweder mit Drupal -Kern geliefert wird oder später über die Benutzeroberfläche erstellt wird.

Was ist also mit Drupal 8? Wir haben gesehen, dass wir für jedes Plugin eines bestimmten Typs eine andere PHP -Klasse deklarieren müssen. Um einen neuen Block zu erstellen, brauchen wir eine neue Klasse. Um einen weiteren Block zu erstellen, brauchen wir eine andere Klasse. Wo sehen wir in Drupal 7 das Looping ? Die kurze Antwort darauf lautet: Innerhalb eines -Plugin -Ableitung

.

In diesem Artikel werden wir die lange Antwort darauf untersuchen und lernen, was Ableitungen sind und wie wir sie verwenden können. Für letztere erstellen wir ein Beispiel im Demo -Modul, das in diesem Git -Repository zu finden ist und das uns hoffentlich helfen sollte, zu verstehen, was vor sich geht. Für ein etwas komplexeres Beispiel ist das Menüsystem großartig, da es für jede seiner Menüs einen einzelnen Block bietet (ähnlich wie bei Drupal 7, aber mit Plugins).

Was wir tun werden, ist eigentlich sehr einfach. Wir werden grundlegende Knotenblockfunktionen implementieren, mit denen wir für alle Artikelknoten auf unserer Website einen Block haben werden. Lächerlich? Sicher. Sollten wir dies für alle Knoten auf unserer Website tun? Auf keinen Fall! Es ist jedoch eine sehr grundlegende Implementierung, um die Dinge kurz zu halten und die Verwendung der Pluginderivate zu demonstrieren.

Plugin -Derivate

Plugin -Derivate sind die Art und Weise, wie ein Plugin eines bestimmten Typs im System als mehrere Instanzen von sich selbst dargestellt werden kann. Mit anderen Worten kann ein Plugin auf eine Deriver -Klasse verweisen, die für die Bereitstellung einer Liste von Plugin -Definitionen verantwortlich ist, die auf dem anfänglichen Plugin basieren (starten Sie die gleiche Basisdefinition), haben jedoch eine geringfügige unterschiedliche Konfigurations- oder Definitionsdaten. Das oben genannte SystemMenublock ist ein gutes Beispiel. Es ist ein einzelnes Plugin, das so viele Derivate hat wie Menüs auf der Website.

etwas tiefer gehen, wenn eine Liste aller Plugins eines bestimmten Typs angefordert wird, verwendet der Plugin -Manager seinen Erkennungsmechanismus, um alle Plugins dieser Art zu laden. Wenn dieser Mechanismus mit dem DerivatediscoveryDecorator dekoriert ist, kann der Manager auch Derivate abrufen. Zu diesem Zweck sucht die Derivaterkennung für eine Ausleitungsklasse für jedes Plugin und fragt sie nach dieser Liste, wenn sie eine findet.

Manager vom Typ Plugin, die die Standard -Basisklasse für die Standard -PluginManager erweitern, sollten normalerweise den Deseivat -Entdeckungsmechanismus aufweisen, der die Standard -Entdeckung dekoriert (Annotationen). Dies ist das häufigste Muster im Drupal -Kern -Plugin -System: Annotatierte Entdeckung, die von Derivaten verpackt ist.

Die Ableitungsklasse

Jetzt, da wir wissen, wie wichtig die Rolle von Plugin -Derivaten ist, lassen Sie uns unsere erste Ausleitungsklasse erstellen, die von unserem Block -Plugin verwendet wird (das wir in einer Minute erstellen werden).

in SRC/Plugin/Derivat/nodeBlock.php des Demo -Moduls haben wir Folgendes:

<?php

/**
 * @file
 * Contains \Drupal\demo\Plugin\Derivative\NodeBlock.
 */

namespace Drupal\demo\Plugin\Derivative;

use Drupal\Component\Plugin\Derivative\DeriverBase;
use Drupal\Core\Entity\EntityStorageInterface;
use Drupal\Core\Plugin\Discovery\ContainerDeriverInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Provides block plugin definitions for nodes.
 *
 * @see \Drupal\demo\Plugin\Block\NodeBlock
 */
class NodeBlock extends DeriverBase implements ContainerDeriverInterface {

  /**
   * The node storage.
   *
   * @var \Drupal\Core\Entity\EntityStorageInterface
   */
  protected $nodeStorage;

  /**
   * Constructs new NodeBlock.
   *
   * @param \Drupal\Core\Entity\EntityStorageInterface $node_storage
   *   The node storage.
   */
  public function __construct(EntityStorageInterface $node_storage) {
    $this->nodeStorage = $node_storage;
  }

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

  /**
   * {@inheritdoc}
   */
  public function getDerivativeDefinitions($base_plugin_definition) {
    $nodes = $this->nodeStorage->loadByProperties(['type' => 'article']);
    foreach ($nodes as $node) {
      $this->derivatives[$node->id()] = $base_plugin_definition;
      $this->derivatives[$node->id()]['admin_label'] = t('Node block: ') . $node->label();
    }
    return $this->derivatives;
  }
}
Nach dem Login kopieren
Nach dem Login kopieren

Alle unsere Klasse müssen implementiert werden, ist das Ausgangsinterface und die implementieren der beiden Methoden. Wir verwenden stattdessen das ContainerIverInterface, da wir unseren Ausleitungsbehälter aufmerksam machen möchten. Warum? Da wir die Abhängigkeitsinjektion verwenden, um den Entitätsmanager von Drupal zu laden, damit wir auf den Knotenspeicher zugreifen können (dies ist, was der Konstruktor und die Methode create () tun). Darüber hinaus erstreckt sich unsere Deriver -Klasse von der Deriverbase -Klasse, da dies bereits eine der erforderlichen Methoden erledigt (getDerivatedeFinition ()).

Schließlich ist GetderivatedEFinitions () die Methode, die für die Bereitstellung einer Reihe von Plugin -Definitionen verantwortlich ist, die aus dem Plugin stammen, das diese Klasse verwendet. Es empfängt die $ Base_plugin_definition als Argument (die Definition des tatsächlichen Plugins, das diesen Deriver verwendet), und wir verwenden dies, um unsere Ableitungsdefinitionen aufzubauen. In unserem Fall laden wir wahllos alle Artikelknoten und erstellen für jede von ihnen eine separate Definition, die sich nur durch eine andere Admin_Label unterscheidet (dies ist eine Eigenschaft in der DrupalcoreblockAnnotation -Annotationsklasse). Das Array der Derivate wird durch die ID des Ableitung gekleidet (in unserem Fall die Knoten -ID, die wir später verwenden werden).

Ein sehr wichtiger Punkt, den wir hier machen müssen, ist, dass das Laden aller Knoten und das Erstellen von Plugins aus ihnen niemals eine gute Idee ist. Was vielleicht interessant wäre, ist die Implementierung von Funktionen, durch die einzelne Knoten über ein Kontrollkästchen oder ähnliches als Blöcke freigelegt werden können.

Das Block -Plugin

Jetzt, da wir unsere Deriver -Klasse haben, erstellen wir ein einfaches Block -Plugin, mit dem es mehrere Instanzen von sich selbst generiert (einen für jeden Artikelknoten).

in SRC/Plugin/Block/NodeBlock.php:

<?php

/**
 * @file
 * Contains \Drupal\demo\Plugin\Derivative\NodeBlock.
 */

namespace Drupal\demo\Plugin\Derivative;

use Drupal\Component\Plugin\Derivative\DeriverBase;
use Drupal\Core\Entity\EntityStorageInterface;
use Drupal\Core\Plugin\Discovery\ContainerDeriverInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Provides block plugin definitions for nodes.
 *
 * @see \Drupal\demo\Plugin\Block\NodeBlock
 */
class NodeBlock extends DeriverBase implements ContainerDeriverInterface {

  /**
   * The node storage.
   *
   * @var \Drupal\Core\Entity\EntityStorageInterface
   */
  protected $nodeStorage;

  /**
   * Constructs new NodeBlock.
   *
   * @param \Drupal\Core\Entity\EntityStorageInterface $node_storage
   *   The node storage.
   */
  public function __construct(EntityStorageInterface $node_storage) {
    $this->nodeStorage = $node_storage;
  }

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

  /**
   * {@inheritdoc}
   */
  public function getDerivativeDefinitions($base_plugin_definition) {
    $nodes = $this->nodeStorage->loadByProperties(['type' => 'article']);
    foreach ($nodes as $node) {
      $this->derivatives[$node->id()] = $base_plugin_definition;
      $this->derivatives[$node->id()]['admin_label'] = t('Node block: ') . $node->label();
    }
    return $this->derivatives;
  }
}
Nach dem Login kopieren
Nach dem Login kopieren

Das erste, was wir in der Annotation dieses Plugins bemerken, ist der Ausleitungsschlüssel, der auf die zuvor erstellte Klasse hinweist. Und das ist im Grunde alles, was wir brauchen, um die beiden zu koppeln. Der abgeleitete Entdeckungsdekorator verarbeitet das schwere Heben.

Ein Großteil des Restes ist ein grundlegendes Blockgebäude, mit dem wir vertraut sein sollten. Interessant ist, dass wir mit der Methode GetderivativeId () die Knoten -ID abrufen können, die wir auch als ID der angezeigten Ableitung verwendet haben, und sie laden das Knotenobjekt und erstellen den Block als die tatsächliche Knotenausgabe. Zuletzt stellen wir in der BlockAccess () -Methode sicher, dass dieser Block die gleichen Zugriffsprüfungen wie der tatsächliche Knoten selbst hat. Wenn der aktuelle Benutzer keinen Zugriff auf den aktuellen Knoten hat, wird der Block nicht einmal angezeigt.

Wenn wir nun die Caches löschen und zur Block -Layout -Schnittstelle navigieren, sollten wir einige Blöcke bezeichnen, die als Knotenblock bezeichnet werden: [Knoten -Titel]. Sie können diese dort platzieren, wo Sie wollen, und sie werden den entsprechenden Knoten rendern.

Schlussfolgerung

In diesem Artikel haben wir uns Pluginderivate angesehen und ein einfaches Beispiel dafür gesehen, wie sie funktionieren. Der Schlüssel zu diesem Thema ist, dass Pluginderivate die Art und Weise sind, wie wir mehrere Instanzen desselben Plugins dynamisch deklarieren. Sie helfen uns normalerweise, die benutzerkonfigurierte Funktionalität (z. B. Menüs) in Plugins (z. B. Menüblöcke) zu verwandeln.

Um die Verwendung von Derivaten zu veranschaulichen, haben wir eine sehr einfache Technik gesehen, mit der wir Artikelknoten als Blöcke rendern können. Wir sollten uns daran erinnern, dies nicht auf einer Website mit vielen Artikelknoten auszuprobieren, sondern zusätzliche Funktionen zu implementieren, die die Anzahl der Knoten einschränkt, die ausgesetzt werden. Sie wissen, also stürzen wir unsere Website nicht ab.

Fragen? Kommentare? Gibt es etwas, das Sie gerne erklären möchten? Lass es uns wissen!

häufig gestellte Fragen (FAQs) zur Verwendung von Drupal 8 -Plugin -Derivaten effektiv

Was sind Drupal 8 -Plugin -Derivate und warum sind sie wichtig? Dies ist besonders nützlich, wenn Sie eine große Anzahl ähnlicher Aufgaben ausführen müssen, aber jede Aufgabe erfordert eine leicht unterschiedliche Konfiguration. Durch die Verwendung von Plugin -Derivaten können Sie ein einzelnes Basis -Plugin erstellen und dann so viele Variationen dieses Plugins erstellen, wie Sie benötigen, jeweils eine eigene eindeutige Konfiguration. Dies kann Ihren Code erheblich vereinfachen und Ihre Drupal 8 -Site effizienter und einfacher zu verwalten. . Zunächst müssen Sie ein Basis -Plugin erstellen, das die grundlegende Funktionalität definiert, die alle Derivate teilen. Als nächstes müssen Sie eine Plugin -Derivatklasse erstellen, die das Basis -Plugin erweitert und die Ableitungsinterface implementiert. Diese Klasse ist für die Generierung der einzelnen Derivate verantwortlich. Schließlich müssen Sie Ihr Plugin -Derivat mit dem Plugin -Manager von Drupal registrieren, damit er entdeckt und verwendet werden kann. Derivate können mit benutzerdefinierten Modulen verwendet werden. In diesem Zusammenhang sind sie besonders nützlich, da Sie ein einzelnes Basismodul erstellen und dann mehrere Variationen dieses Moduls mit jeweils eine eigene eindeutige Konfiguration erzeugen. Dies kann den Entwicklungsprozess erheblich vereinfachen und Ihre benutzerdefinierten Module effizienter und einfacher zu verwalten. und kann in einer Vielzahl von Szenarien verwendet werden. Einige häufige Anwendungsfälle umfassen das Erstellen mehrerer Instanzen eines Block -Plugins mit jeweils einer anderen Konfiguration. Erzeugen Sie mehrere Menü -Links über ein einzelnes Basis -Plugin; und erstellen Sie mehrere Variationen eines benutzerdefinierten Moduls, die jeweils auf eine bestimmte Aufgabe oder Anforderung zugeschnitten sind. Verfolgung des Basis-Plugins und aller seiner Derivate, um sicherzustellen, dass sie alle aktuell sind und korrekt funktionieren. Dies kann über den Plugin -Manager von Drupal erfolgen, der eine zentrale Schnittstelle zum Verwalten aller Plugins bietet. Darüber hinaus ist es wichtig, Ihre Plugin -Derivate regelmäßig zu überprüfen und zu aktualisieren, um sicherzustellen, dass sie Ihre Anforderungen und die Anforderungen der Benutzer Ihrer Website weiterhin entsprechen.

Gibt es Einschränkungen oder Herausforderungen bei der Verwendung von Drupal 8 -Plugin -Derivaten? Eine der Hauptherausforderungen besteht darin, dass sie komplex sein können, um es zu errichten und zu verwalten, insbesondere für Entwickler, die mit Drupal neu sind oder mit seinem Plugin -System nicht vertraut sind. Da jedes Derivat eine Variation eines einzelnen Basis-Plugins ist, können Änderungen am Basis-Plugin möglicherweise alle seine Derivate beeinflussen. Daher sind sorgfältiges Management und Test erforderlich. Party-Plugins? Es ist jedoch wichtig zu beachten, dass nicht alle Plugins von Drittanbietern für die Unterstützung von Derivaten ausgelegt sind. Möglicherweise müssen Sie möglicherweise zusätzliche Arbeiten erledigen, um sie kompatibel zu machen. Überprüfen Sie immer die Dokumentation für das spezifische Plugin, das Sie verwenden, um zu sehen, ob es Derivate unterstützt und wie sie implementiert werden. Kann die Leistung der Website verbessern, indem die Codemenge reduziert wird, die für jede Aufgabe ausgeführt werden muss. Wenn Sie ein einzelnes Basis -Plugin erstellen und dann mehrere Derivate generieren, können Sie vermeiden, für jede Aufgabe separate Code zu schreiben und auszuführen. Dies kann zu einem erheblichen Leistungsschub führen, insbesondere für Websites mit einer großen Anzahl ähnlicher Aufgaben. kann aufgrund ihrer dynamischen Natur eine Herausforderung sein. Drupal bietet jedoch mehrere Werkzeuge und Techniken, um dies zu unterstützen. Eines der nützlichsten ist das Entwicklungsmodul, das eine Reihe von Debugging- und Entwicklungstools bietet. Darüber hinaus kann Drupals Fehlerprotokollierungsfunktionen und Berichterstattung wertvolle Informationen zu Problemen liefern, die auftreten. Weitere Informationen über Drupal 8 -Pluginderivate. Die offizielle Drupal -Dokumentation ist ein großartiger Ausgangspunkt, da sie umfassende Informationen zu allen Aspekten der Drupal -Entwicklung, einschließlich Pluginderivaten, liefert. Darüber hinaus stehen viele Tutorials, Blog -Beiträge und Forum -Diskussionen zur Verfügung, die dieses Thema ausführlich behandeln.

Das obige ist der detaillierte Inhalt vonTutorial über die Verwendung von Drupal 8 -Plugin -Derivaten effektiv. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage