Heim > Backend-Entwicklung > PHP-Tutorial > Drupal 8 -Module - Konfigurationsverwaltung und Servicecontainer

Drupal 8 -Module - Konfigurationsverwaltung und Servicecontainer

Christopher Nolan
Freigeben: 2025-02-21 10:17:09
Original
1010 Leute haben es durchsucht

Drupal 8 Modules - Configuration Management and the Service Container

Kernpunkte

    Die
  • Drupal 8 -Klasse ConfigFormBase bietet zusätzliche Funktionen für die Interaktion mit dem Konfigurationssystem, sodass Tools Formulare in gespeicherte Werte konvertieren können. Dies kann durch Ersetzen der Erweiterungsklasse durch ConfigFormBase ersetzt und die erforderlichen Änderungen im Formular vorgenommen werden. Die Konfiguration in Drupal 8 wird in einer YAML -Datei gespeichert und kann über die Benutzeroberfläche für die Bereitstellung über verschiedene Websites hinweg geändert werden.
  • Der Service -Container in Drupal 8 ermöglicht die Erstellung eines Dienstes, dh eine PHP -Klasse, die globale Operationen ausführt, und registriert ihn in den Service -Container für den Zugriff. Die Abhängigkeitsinjektion wird verwendet, um Objekte an andere Objekte weiterzugeben, um die Entkopplung zu gewährleisten. Sie können einen Dienst registrieren, indem Sie eine demo.services.yml -Datei im Stammverzeichnis des Moduls erstellen.
  • Abhängigkeitsinjektion in Drupal 8 ist ein Entwurfsmuster, mit dem ein Objekt Abhängigkeiten für ein anderes bereitstellt, wodurch der Code modularer und einfacher zu testen wird. Dies kann erreicht werden, indem die ControllerBase -Klassungen erweitert oder die ContainerInjectionInterface implementiert werden. Sie können auch die Drupal -Klasse verwenden, um auf den Dienst weltweit zugreifen zu können.

Beachten Sie, dass einige Code -Teile möglicherweise veraltet sein, da Drupal 8 zum Zeitpunkt des Schreibens in der Entwicklung ist. Bitte schauen Sie sich dieses Repository an. Ich habe versucht, den Beispielcode zu aktualisieren und ihn mit der neuesten Drupal 8 -Version kompatibel zu machen.

In früheren Artikeln zur Entwicklung von Drupal 8 -Modul haben wir uns mit der Erstellung von Blocktypen und -formen befasst. Wir haben gesehen, dass Blöcke jetzt wiederverwendbar sind und dass alles, was zum Definieren von Blocktypen erforderlich ist, in einer Klasse durchgeführt wird. In ähnlicher Weise werden auch Funktionen für die Erzeugungsgenerierung in einer Klasse gruppiert, in der die von einer bestimmten Methode ausgeführten Aufgaben denen ähnlich sind, an die wir in Drupal 7 gewohnt sind.

In diesem Tutorial werde ich weiterhin von dem, wo wir das letzte Mal beendet haben, fortfahren. Ich werde erklären, wie Sie unser DemoForm in ein Formular umwandeln, mit dem Werte über das Drupal 8 -Konfigurationssystem gespeichert werden. Danach veranschaulichen wir die Servicebehälter und die Abhängigkeitsinjektion mit Beispielen.

Vergessen Sie nicht, wenn Sie den gesamten Code in dieser Tutorial -Serie geschrieben haben möchten, können Sie sich dieses Repository ansehen.

Konfigurationsformular

Als wir DemoForm zum ersten Mal definiert haben, erweiterten wir die FormBase -Klasse, die die einfachste Implementierung von FormInterface ist. Drupal 8 wird jedoch auch mit einem ConfigFormBase ausgestattet, das einige zusätzliche Funktionen bietet, die das Interaktion mit dem Konfigurationssystem sehr einfach machen.

Was wir jetzt tun müssen, ist DemoForm in ein Formular umzuwandeln, das die vom Benutzer eingegebene E -Mail -Adresse speichert. Das erste, was wir tun sollten, ist die Erweiterungsklasse durch ConfigFormBase (und natürlich use it):

use Drupal\Core\Form\ConfigFormBase;

class DemoForm extends ConfigFormBase {
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Bevor wir den Rest des Formulars weiter ändern, schauen wir uns an, wie einfache Konfigurationen in Drupal 8 funktionieren. Ich sagte "einfach", weil es komplexere Konfigurationseinheiten gibt, die wir heute nicht vorstellen werden. Derzeit wird die vom Modul bereitgestellte Konfiguration (Kern oder Beitrag) in der YAML -Datei gespeichert. Wenn das Modul aktiviert ist, werden diese Daten in die Datenbank importiert (um die Leistung bei der Verwendung zu verbessern). Mit der Benutzeroberfläche können wir diese Konfiguration ändern und sie dann einfach in eine YAML -Datei für die Bereitstellung über verschiedene Websites exportieren.

Das

-Modul kann eine Standardkonfiguration in der YAML -Datei im Ordner config/install im Modul -Root -Verzeichnis bereitstellen. Die Namenskonvention für diese Datei besteht darin, den Namen des Moduls zu präfixen. Erstellen wir also eine Datei namens demo.settings.yml. Lassen Sie uns in dieser Datei Folgendes einfügen:

demo:
  email_address: demo@demo.com
Nach dem Login kopieren
Nach dem Login kopieren

Dies ist eine verschachtelte Struktur (wie ein assoziatives Array in PHP). Unter der Taste demo haben wir ein weiteres Schlüsselwertpaar. Um auf diese verschachtelten Werte zuzugreifen, verwenden wir in der Regel Punkte (.). In unserem Fall ist es demo.email_address.

Sobald wir diese Datei haben, müssen Sie sich daran erinnern, dass diese Datei nur dann importiert wird, wenn das Modul installiert ist. Also bringe es wieder neu. Jetzt können wir zu unserem Form zurückkehren und nacheinander die Methoden sehen, die angepasst werden müssen.

so sieht die buildForm() -Methode jetzt aus:

public function buildForm(array $form, array &$form_state) {

  $form = parent::buildForm($form, $form_state);

  $config = $this->config('demo.settings');

  $form['email'] = array(
    '#type' => 'email',
    '#title' => $this->t('Your .com email address.'),
    '#default_value' => $config->get('demo.email_address')
  );

  return $form;
}
Nach dem Login kopieren
Nach dem Login kopieren

im Gegensatz zu FormBase im Gegensatz zu ConfigFormBase implementiert die

-Klasse diese Methode auch, um dem Formulararray Elemente hinzuzufügen (Senden -Taste). Bevor wir unsere eigenen Elemente hinzufügen, können wir das verwenden, was wir vor der Elternklasse getan haben.

Config jetzt für den Konfigurationsabschnitt. Drupal 8 liefert ein ConfigFormBase -Objekt, mit dem wir mit der Konfiguration interagieren können. Einige Klassen haben es durch Abhängigkeitsinjektion erhalten.

Dies ist eine solche Klasse.

config() Wie Sie sehen, verwenden wir die Config -Methode der übergeordneten Klasse, um ein demo.settings -Objekt abzurufen, das mit unserer #default_value einfachen Konfiguration besiedelt wurde. Für das Config des E -Mail -Formularelements verwenden wir dann die get() -Methode des

-Objekts, um den Wert der E -Mail -Adresse abzurufen.

validateForm() Als nächstes müssen wir nur den Commit -Handler ändern, da die

-Methode jetzt gleich bleiben kann:
public function submitForm(array &$form, array &$form_state) {

  $config = $this->config('demo.settings');
  $config->set('demo.email_address', $form_state['values']['email']);
  $config->save();

  return parent::submitForm($form, $form_state);
}
Nach dem Login kopieren

Config In dieser Methode rufen wir zunächst das von uns konfigurierte set() -Objekt ab (wie wir zuvor). Anschließend verwenden wir seine email_address -Methode, um den Wert von save() in den von Benutzer eingereichten Wert zu ändern. Dann verwenden wir die

-Methode, um die Konfiguration zu speichern. Schließlich erweitern wir den übergeordneten Commit -Handler, da er einige Funktionen enthält (in diesem Fall wird die Drupal -Nachricht auf den Bildschirm festgelegt). <🎜>

Das war's. Sie können den Cache löschen und es versuchen. Durch das Senden einer neuen E -Mail -Adresse speichern Sie sie in der Konfiguration. Die demo.settings.yml -Datei ändert sich sicherlich nicht, aber Sie können die Konfiguration demo.settings auf eine andere Site importieren.

Service Container und Abhängigkeitsinjektion

Das nächste, was wir uns ansehen möchten, ist der Service -Container. Die Philosophie hinter dem Dienst besteht darin, die Funktionalität in wiederverwendbare Komponenten aufzuteilen. Daher ist ein Dienst eine PHP -Klasse, die einige globale Operationen und Register für den Zugang zum Servicecontainer ausführt.

Abhängigkeitsinjektion ist die Art und Weise, wie wir Objekte übergeben, um die Entkopplung sicherzustellen. Jeder Service muss eine Sache erledigen, und wenn er einen anderen Service benötigt, kann letzteres in die ersteren injiziert werden. Aber wir werden sehen, wie es sofort geht.

Als nächstes erstellen wir einen sehr einfachen Dienst und registrieren ihn in den Container. Es hat nur einen echten Weg, um einfache Werte zurückzugeben. Anschließend injizieren wir den Dienst als Abhängigkeit in unseren DemoController und verwenden den vom Dienst bereitgestellten Wert.

Um einen Dienst zu registrieren, müssen wir eine demo.services.yml -Datei erstellen, die sich im Stammverzeichnis des Moduls befindet, mit dem folgenden Inhalt:

use Drupal\Core\Form\ConfigFormBase;

class DemoForm extends ConfigFormBase {
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Die Datei -Benennungskonvention lautet module_name.services.yml.

Die erste Zeile erstellt eine Reihe von Diensten. Die zweite Zeile definiert den ersten Dienst (genannt demo_service, der vom Modulnamen vorangestellt wurde). Die dritte Zeile gibt die Klasse an, die für diesen Service instanziiert wird. Als nächstes erstellen Sie die src/ Klassendatei im Ordner DemoService.php unseres Moduls. Dies ist, was mein Dienst tut (eigentlich nichts, nur um zu veranschaulichen, wie man ihn benutzt):

demo:
  email_address: demo@demo.com
Nach dem Login kopieren
Nach dem Login kopieren

Hier muss nichts erklärt werden, da es sehr einfach ist. Wenden wir uns als nächstes an unseren DemoController und nutzen Sie diesen Dienst. Wir können dies auf zwei Arten tun: Zugriff auf den Container weltweit über die Drupal -Klasse oder über ein Objekt dieser Klasse an unseren Controller weitergeben. Best Practice deuten darauf hin, dass wir den zweiten Ansatz verfolgen sollten, also werden wir das tun. Aber manchmal benötigen Sie einen globalen Zugang zum Service. Dazu können Sie Folgendes tun:

public function buildForm(array $form, array &$form_state) {

  $form = parent::buildForm($form, $form_state);

  $config = $this->config('demo.settings');

  $form['email'] = array(
    '#type' => 'email',
    '#title' => $this->t('Your .com email address.'),
    '#default_value' => $config->get('demo.email_address')
  );

  return $form;
}
Nach dem Login kopieren
Nach dem Login kopieren

jetzt $service ist das Objekt der gerade erstellten DemoService -Klasses. Aber lassen Sie uns sehen, wie wir unseren Dienst als Abhängigkeit in der DemoController -Klasse injizieren können. Ich werde erklären, was zuerst erledigt werden muss, und dann werden Sie einen vollständigen Controller mit all den Änderungen sehen.

Erstens müssen wir auf den Service -Container zugreifen. Dies ist für den Controller sehr einfach. Wir können die ControllerBase -Klasse erweitern, die uns zusätzlich zu einigen anderen Helferprogrammen vermittelt. Alternativ kann unser Controller ContainerInjectionInterface implementieren, wodurch wir auch auf den Container zugreifen können. Aber wir werden uns an ControllerBase halten, also brauchen wir use die Klasse.

Als nächstes benötigen wir use Symfony 2 ContainerInterface als Voraussetzung für die create() -Methode, die ein anderes Objekt des Controllers instanziiert und den gewünschten Dienst übergibt.

Schließlich benötigen wir einen Konstruktor, um die übergebenen Serviceobjekte (das zurückgegebene Objekt von create()) zu erhalten und sie den Eigenschaften für die spätere Verwendung zuzuweisen. create() Die Reihenfolge, in der die Methode Objekte zurückgibt, muss die Reihenfolge widerspiegeln, in der sie an den Konstruktor übergeben werden.

Schauen wir uns also unsere modifizierte DemoController:

an
use Drupal\Core\Form\ConfigFormBase;

class DemoForm extends ConfigFormBase {
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Wie Sie sehen können, sind alle Schritte hier. Die create() -Methode erstellt eine neue Instanz unserer Controller -Klasse und übergibt den vom Container abgerufenen Dienst an ihn. Schließlich wird eine Instanz der DemoService -Klasse in der Eigenschaft $demoService gespeichert, mit der wir seine getDemoValue() -Methode aufrufen können. Dieser Wert wird dann in der "Hello" -Meldung verwendet. Löschen Sie den Cache und probieren Sie es aus. Gehen Sie zum demo/ Pfad und Sie sollten den "Hallo uppchuk" auf der Seite sehen.

Ich glaube, Sie können die Kraft des Service -Containers sehen, da wir jetzt entkoppelte Funktionen schreiben und sie bei Bedarf übergeben können. Ich zeige Ihnen nicht, wie es geht, aber Sie können bei der Registrierung für einen Dienst Abhängigkeiten deklarieren. Dies bedeutet, dass bei Drupal ein Serviceobjekt für alle seine Abhängigkeiten erledigt und an seinen Konstruktor weitergegeben wird. Weitere Informationen zu dieser Dokumentseite finden Sie mehr darüber.

Schlussfolgerung

In diesem Artikel haben wir uns viele coole Sachen angesehen. Wir haben gesehen, wie das Konfigurationssystem einfache Konfigurationen verwaltet und welche "Form" -Funktionen dafür bereitgestellt werden. Ich ermutige Sie, zu untersuchen, wie ConfigFormBase implementiert ist und welche Funktionen bei der Erweiterung verfügbar sind. Darüber hinaus sollten Sie die Verwendung von Import-/Exportkonfigurationen zwischen Websites in der Benutzeroberfläche üben. Von nun an wird dies eine große Verbesserung des Einsatzprozesses sein.

Wir haben uns dann die Dienste angesehen, was sie sind und wie sie funktionieren. Eine gute Möglichkeit, wiederverwendbare und entkoppelte Funktionsblöcke aufrechtzuerhalten, die von überall zugänglich sind. Ich hoffe, das Konzept der Abhängigkeitsinjektion ist nicht mehr so ​​beängstigend (wenn es für Sie ist). Es ist im Grunde dasselbe wie die Übergabe von Parametern an prozedurale Funktionen, wird jedoch hinter den Kulissen von Symfony und seinen leistungsstarken Servicecontainern mit Konstruktormethoden (oder Setzen) durchgeführt.

häufig gestellte Fragen zum Erstellen von Drupal 8 Modulen: Konfigurationsverwaltungs- und Service -Container

Welche Rolle spielt die Dienstleistungscontainer in Drupal 8?

Der Service -Container in Drupal 8 ist eine Schlüsselkomponente, die die Erstellung von Diensten verwaltet, Objekte, die weltweit in Drupal -Anwendungen verwendet werden. Es stellt sicher, dass jeder Dienst nur einmal instanziiert wird, was Speicher speichert und die Leistung verbessert. Der Service -Container behandelt auch die Abhängigkeitsinjektion, ein Entwurfsmuster, mit dem ein Objekt Abhängigkeiten für ein anderes Objekt bereitstellt. Dies macht den Code modularer, einfacher zu testen und fördert eine bessere Organisation.

Wie kann man einen neuen Dienst in Drupal 8 definieren?

Um einen neuen Dienst in Drupal 8 zu definieren, müssen Sie im Stammverzeichnis des Moduls eine services.yml Datei erstellen. Diese Datei sollte den Namen, die Klasse und die Parameter des Dienstes enthalten. Diese Klasse sollte der vollständig qualifizierte Name der Klasse sein, der den Dienst implementiert, und die Parameter sollten jeder Dienst oder Parameter sein, von dem der Dienst abhängt.

Was ist der Zweck der Konfigurationsverwaltung in Drupal 8?

Konfigurationsverwaltung in Drupal 8 ist ein System, mit dem Sie die Konfigurationsdaten auf konsistent verwalten können. Sie können Konfigurationsdaten importieren, exportieren und synchronisieren. Es bietet auch eine Möglichkeit, Änderungen der Site -Konfiguration im Laufe der Zeit zu verfolgen und zu verwalten.

Wie exportieren und importieren Sie Konfigurationsdaten mithilfe des Konfigurationsverwaltungssystems?

Um Konfigurationsdaten in Drupal 8 zu exportieren, können Sie die Konfigurationsverwaltungsschnittstelle im Administratorbereich verwenden oder den Befehl drush verwenden. Die exportierten Daten werden im YAML -Format angezeigt und können leicht gelesen und bearbeitet werden. Um Konfigurationsdaten zu importieren, können Sie die exportierte YAML -Datei über die Konfigurationsverwaltungsschnittstelle hochladen oder den Befehl drush verwenden. Denken Sie daran, Ihre Website zu sichern, bevor Sie Konfigurationsdaten importieren, um potenzielle Datenverluste zu verhindern.

Was ist Abhängigkeitsinjektion und warum ist es in Drupal 8 wichtig?

Abhängigkeitsinjektion ist ein Entwurfsmuster, mit dem ein Objekt Abhängigkeiten für ein anderes Objekt bereitstellt. In Drupal 8 wird es verwendet, um Dienste und Controller modularer und einfacher zu testen. Anstatt Abhängigkeiten in einem Objekt zu erstellen, werden sie über eine Konstruktor- oder Settermethode übergeben (injiziert). Dies erleichtert den Code, flexibler und weniger gekoppelt zu testen.

Wie kann ich meinen Drupal 8 -Service Abhängigkeiten injizieren?

Um Abhängigkeiten in Dienste in Drupal 8 injizieren zu können, müssen Sie sie in der Definition von Diensten in der services.yml -Datei definieren. Die Abhängigkeiten sollten unter dem Schlüssel arguments aufgeführt werden. Wenn ein Dienst erstellt wird, übergibt der Dienstcontainer diese Abhängigkeiten automatisch an den Konstruktor des Dienstes.

Was ist der Unterschied zwischen Diensten und Plug-Ins in Drupal 8?

In Drupal 8 ist ein Dienst ein Objekt, das globale Aufgaben in einer Anwendung ausführt, während ein Plug-In ein Objekt ist, das bestimmte Aufgaben auf Stecker ausführt. Dienste werden in der Datei services.yml definiert und vom Service-Container verwaltet, während Plug-Ins vom Plug-in-Manager entdeckt und instanziiert werden.

Wie kann ich Dienste in Drupal 8 außer Kraft setzen?

Um einen Dienst in Drupal 8 zu überschreiben, müssen Sie einen Dienst mit demselben Namen wie der Dienst definieren, den Sie in der Datei services.yml des Moduls überschreiben möchten. Ihr neuer Service sollte die Klasse des ursprünglichen Dienstes erweitern und die Methode, die Sie ändern möchten, überschreiben.

So verwenden Sie das Konfigurationsverwaltungssystem, um Änderungen in der Site -Konfiguration zu verfolgen?

Das Konfigurationsverwaltungssystem in Drupal 8 bietet eine Möglichkeit, die Konfigurationsänderungen von Site über ein Konfigurations -Snapshot -System zu verfolgen. Dieses System hat eine Momentaufnahme der aktiven Konfiguration der Website, wenn Sie Konfigurationsdaten importieren oder synchronisieren. Sie können diese Schnappschüsse dann vergleichen, um zu sehen, welche Änderungen vorgenommen wurden.

services.yml Was macht eine Datei in Drupal 8?

Die Datei services.yml in Drupal 8 ist der Ort, an dem Moduldienste definiert werden. Jeder Dienst wird unter Verwendung eines eindeutigen Namens, eines voll qualifizierten Namens der Klasse definiert, der den Dienst implementiert, und von Dienst oder Parametern, von denen der Dienst abhängt. services.yml Dateien werden vom Service -Container gelesen und der Service -Container verwaltet die Erstellung und Injektion des Dienstes.

Das obige ist der detaillierte Inhalt vonDrupal 8 -Module - Konfigurationsverwaltung und Servicecontainer. 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