Kernpunkte
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. demo.services.yml
-Datei im Stammverzeichnis des Moduls erstellen. 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 {
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
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; }
im Gegensatz zu FormBase
im Gegensatz zu ConfigFormBase
implementiert die
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.
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
validateForm()
Als nächstes müssen wir nur den Commit -Handler ändern, da die
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); }
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
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 {
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
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; }
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
:
use Drupal\Core\Form\ConfigFormBase; class DemoForm extends ConfigFormBase {
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
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.
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.
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.
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.
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.
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.
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.
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.
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!