Das Modifizieren von bestehendem Code mag für einen Entwickler ein Riesenspaß sein, aber was ist mit dem Zeitpunkt, an dem man sich auf unbekanntes Terrain wagen und eigene benutzerdefinierte Module erstellen muss?
Beängstigend, oder?
Aber keine Angst, denn Drupal 8 ist da.
Drupal 8 verwendet ein PHP-Framework namens Symphony, das stark auf objektorientierter Programmierung basiert.
Es bietet seinen Nutzern Vorteile wie die Wiederverwendung und Kapselung von Code, und diese Vorteile ermöglichen es den Nutzern, Code besser zu pflegen und zu strukturieren.

Puh!
Dies könnte Sie jedoch mit einer Reihe von Fragen zurücklassen - Was muss ich in Drupal 8 wissen, um mit der Entwicklung zu beginnen? Was ist OOP? Warum wird es in Drupal 8 verwendet, um Module zu erstellen? Wie erstellt es die benutzerdefinierten Module?
Hier erfahren Sie, wie Sie all dies tun können, um das OOP-Prinzip von PHP etwas weniger entmutigend zu gestalten.
Beginnen Sie mit den Voraussetzungen, um benutzerdefinierte Module zu erstellen
Wir alle wissen, dass die objektorientierte Programmierung uns die Möglichkeit gegeben hat, unsere gewünschten Objekte zu erstellen und Methoden zu entwickeln, um sie zu handhaben. Und mit der Verwendung verschiedener OOP-Prinzipien und Designmuster hat Drupal 8 einen viel einfacheren Weg in Bezug auf die Entwicklung geschaffen.
Drupal 8 dient als eine großartige Einführung in PHP. Hier sind einige der Designmuster, die wichtig sind, um das grundlegende objektorientierte Designproblem zu verstehen.
PHP-Namespace (eingeführt in Version 5.3)
In PHP kann man nicht zwei Klassen haben, die mit demselben Namen arbeiten (sie müssen eindeutig sein). Daher ermöglicht Ihnen der PHP-Namespace, dieses Problem zu umgehen, indem er einen ähnlichen Code in übersichtliche kleine Pakete präsentiert oder sogar die Eigentümerschaft bestimmt.
Drupal 8 besteht aus einer Reihe von Dateien, die den Namespace deklarieren, um mit PHP 5.3 kompatibel zu bleiben. Daher können mit Hilfe von zwei Standards in Drupal PHP-Schnittstellen und -Traits leicht mit Namespaces versehen werden.
Use-Anweisung
Klassen und Schnittstellen mit einem (\) Backslash innerhalb ihres vollständig qualifizierten Namens sollten diesen nicht innerhalb des Kerns verwenden. Wenn er sich von der aktuellen Datei unterscheidet, kann dies mit der Anweisung "use" oben gelöst werden. Zum Beispiel
namespace Drupal\mymodule\Tests\Foo; use Drupal\simpletest\WebTestBase; /** * Tests that the foo bars. */ class BarTest extends WebTestBase {
Und für die Datei, die keinen Namespace deklariert, muss dies mit der Use-Anweisung am Anfang der Datei angegeben werden
Für die Klassen, die keinen Backslash haben, müssen sie vollständig qualifiziert sein, wenn sie in der Namespace-Datei verwendet werden.
Verwenden Sie auch beim Importieren einer Klasse mit "use" nicht den Backslash.
Aliasing der Klasse
PHP hat es den Klassen erlaubt, Aliase zu verwenden, wenn sie in einen Namespace importiert werden. Dies geschieht, um Kollisionen zu vermeiden. Aber nehmen wir an, die Kollision tritt trotzdem auf, dann können Sie die Klassen mit einem Präfix versehen, das den nächsthöheren Teil des Namespace enthält.
use Foo\Bar\Baz as BarBaz; use Stuff\Thing\Baz as ThingBaz; /** * Tests stuff for the whichever. */ function test() { $a = new BarBaz(); // This will be Foo\Bar\Baz $b = new ThingBaz(); // This will be Stuff\Thing\Baz }
Dependency Injections
Dependency Injection ist ein Software-Designmuster, das es Ihnen ermöglicht, fest codierte Abhängigkeiten zu entfernen und es auch ermöglicht, diese entweder zur Laufzeit oder zur Kompilierzeit zu ändern.
Drupal 8 führte das Konzept der Services (vom Service-Container verwaltete Objekte) ein, um wiederverwendbare Funktionalitäten zu entkoppeln. Es macht die Services durch Registrierung mit Hilfe eines Service-Containers steckbar und austauschbar.
Diese Services werden verwendet, um Operationen durchzuführen, die den Zugriff auf die Datenbank oder das Versenden einer E-Mail beinhalten. Um also den Code einfach auf die Datenbank zugreifen zu lassen (ohne sich darum zu kümmern, ob die Datenbank MySQL oder SQLite ist), wird die Verwendung des vom Core bereitgestellten Service über den Service-Container durchgeführt.
Diese Core-Services sind in CoreServiceProvider.php und core.services.yml definiert. So ähnlich wie:
... language_manager: class: Drupal\Core\Language\LanguageManager arguments: ['@language.default'] ... path.alias_manager: class: Drupal\Core\Path\AliasManager arguments: ['@path.crud', '@path.alias_whitelist', '@language_manager'] ... string_translation: class: Drupal\Core\StringTranslation\TranslationManager ... breadcrumb: class: Drupal\Core\Breadcrumb\BreadcrumbManager arguments: ['@module_handler'] ...
Jeder Service hängt von dem anderen Service ab. Wie in dem obigen Beispiel hängt path.alias_manager von den in der Argumentliste angegebenen Services path.crud, path.alias_whitelist und language_manager ab.
Dependency Injection ist die bevorzugte Vorgehensweise für den Zugriff auf und die Verwendung von Services in Drupal 8. Services werden als Argument an den Container übergeben oder über Setter-Methoden injiziert.
Symfony
Symfony ist ein PHP-Framework, das Drupal verwendet, um Codeduplizierung über verschiedene PHP-Projekte hinweg zu reduzieren. Ein Großteil des Codes, den Drupal 8 verwendet, um Routing, Sessions und Service-Container zu handhaben. Diese Komponenten sind flexible und universelle Lösungen. Sie sind stabil und lösen die meisten Probleme, bei denen es keine gute Praxis ist, das Rad neu zu erfinden. Symfony folgt den Standards, die PSR-5 und PSR-7 entsprechen.
Annotations
Annotations sind die Kommentare in Ihrem Code, die Meta-Informationen enthalten. Der Hauptvorteil von Annotations ist, dass sie die Leistung aufgrund des geringeren Speicherverbrauchs verbessern und in denselben Dateien wie die Klasse platziert werden. Zum Beispiel
/** * Provides a 'Custom' Block * * @Block( * id = "custom_block", * admin_label = "Custom block", * ) */
Drupal 8 verwendet PHP-Annotations für die Plugin-Erkennung und um zusätzlichen Kontext/Meta-Daten für die auszuführenden Codes darzustellen. Diese werden mit dem Doctrine Annotation Parser gelesen (bietet die Möglichkeit, benutzerdefinierte Annotation-Funktionen für PHP-Klassen zu implementieren.) und dann in Informationen umgewandelt, die Drupal verwenden kann, um besser zu verstehen, was Ihr Code eigentlich tut.
Plugins
Plugins werden als kleine Funktionseinheiten betrachtet, die ausgetauscht werden können. Drupal besteht aus verschiedenen Plugins mit unterschiedlichen Typen. Die CMS-Plattform bietet eine Reihe von Richtlinien und wiederverwendbaren Codekomponenten, die es dem Entwickler ermöglichen, steckbare Komponenten innerhalb ihres Codes freizulegen und diese Komponenten mit der Benutzeroberfläche zu verwalten. Plugins haben drei grundlegende Elemente, nämlich.
Plugin-Typ: Es ist eine zentrale Steuerklasse, die definiert, wie das Plugin dieses Typs entdeckt und instanziiert wird.
Plugin-Erkennung: Es ist der Prozess des Findens von Plugins innerhalb der Codebasis, die für die Verwendung qualifiziert sind.
Plugin-Factory: Sie ist für die Instanziierung spezifischer Plugins verantwortlich.
Nicht zu vergessen die OOP-Coding-Standards
Wenn der Endbenutzer die wichtigsten OOP-Prinzipien und Designmuster kennt, wird es für ihn noch einfacher, sie mit Drupal zu verwenden. Zum Beispiel werden verschiedene Services verfügbar, wenn der Standard-Container während des Bootstrapping von Drupal initialisiert wird. Kurz gesagt, Sie haben die Möglichkeit, Ihre eigene Klasse zu erstellen, sie dann als Service zu definieren und sie im Container verfügbar zu machen.
Drupal 8 hat eine Reihe von Coding-Standards nur für objektorientierten Code und hält sich an gängige PHP-Coding-Konventionen.
Einige der gängigen PHP-Konventionen für OOP, die Drupal für Best Practices befolgt, sind:
- Deklarieren einer Klasse in OOP. Es ist wichtig, dass es immer eine Schnittstelle oder ein Trait pro Datei geben sollte. Die Klassen werden basierend auf der PSR-4-Namespacing-Konvention automatisch geladen, und im Core beginnt der Baum unter PSR-4 als core/lib/. Für die Module, die Contrib, Custom und die im Core enthalten, beginnt der PSR-4-Baum unter Modulename/src. Es sollte auch beachtet werden, dass es nur möglich ist, eine Klasse in einem Modul zu definieren, wenn die Klasse keine Superklasse enthält.
- Als nächstes in diesen Coding-Standards wäre die Whitespace- oder Einrückungsmethode. Beide lassen eine leere Zeile zwischen dem Beginn der Klassendefinition und der Eigenschaftsdefinition. So wie hier:
class GarfieldTheCat implements FelineInterface { // Leave an empty line here. public function meow() { ... ... ...
Für einen leeren Raum zwischen Eigenschaftsdefinition und Methodendefinition:
... ... ... protected $lasagnaEaten = 0; // Leave an empty line here. public function meow() { return t('Meow!'); }
Und dann für den Abstand zwischen dem Ende der Methode und dem Ende der Klassendefinition:
class GarfieldTheCat implements FelineInterface { ... ... ... public function eatLasagna($amount) { $this->lasagnaEaten += $amount; } // Leave an empty line here. }
- Ohne grundlegende Namenskonventionen ist der Coding-Standard für OOP eine Leere. Diese Namenskonventionen (Regelsatz) helfen Ihnen bei der Auswahl der Zeichenfolge, die für den Bezeichner verwendet werden soll, der die Variablen, Funktionen, Typen und andere Entitäten bezeichnet.
- Es kann vorkommen, dass Sie auch Ihren Code erweitern möchten. Daher würde die Verwendung einer separaten Schnittstellendefinition Ihnen helfen, indem sie in Bezug auf Flexibilität einen hohen Beitrag leistet und auch das Dokument übersichtlich zentralisiert, wodurch es leichter zu lesen ist. Eine Klasse, die erweitert werden muss, muss immer eine Schnittstelle bereitstellen, die andere Klassen implementieren können, anstatt sie zu zwingen, die Basisklasse zu erweitern.
- Außerdem ist es wichtig, dass alle Methoden und Eigenschaften von Klassen die Sichtbarkeit (privat, geschützt oder öffentlich) angeben. Die Verwendung von öffentlichen Eigenschaften wird dringend abgeraten. Sie ermöglicht das Eintreten von unerwünschten Nebeneffekten und legt implementierungsspezifische Details offen, was wiederum den Austausch der Klasse (gegen eine andere Implementierung) viel schwieriger macht.
- Nun kommt das "Type Hinting" in PHP. Es wird im Grunde verwendet, um den erwarteten Datentyp eines Arguments in einer Funktionsdeklaration anzugeben. Obwohl Type Hinting optional ist, wird es für das Debuggen empfohlen. Wenn ein Objekt des falschen Typs übergeben wird, wird ein Fehler angezeigt. Wenn der Parameter der Methode einen bestimmten Schnittstellentyp erwartet, ist es wichtig, diesen anzugeben. Dies würde garantieren, dass Sie auf einen Typ prüfen und auch einen flüssigen Code pflegen.
- Als nächstes kommt die Instanziierung. Es ist im Grunde die Erstellung einer realen Instanz oder einer einzelnen Realisierung einer Abstraktion/Vorlage, wie z. B. die Klasse des Objekts. Drupal Coding-Standards sehen die direkte Erstellung von Klassen kritisch. Vielmehr ist es besser, eine Funktion zu erstellen, um das Objekt zu instanziieren und zurückzugeben. Das liegt daran:
- Die Funktion, die geschrieben wird, kann wiederverwendet werden, um verschiedene Objekte mit derselben Schnittstelle zurückzugeben, wie sie benötigt wird.
- Es ist Ihnen nicht erlaubt, Construct in PHP zu verketten, aber es ist Ihnen erlaubt, Return-Objekte von der Funktion zu verketten.
- Zu guter Letzt - Verkettung. Verkettung ist der Segen für Sie, der es Ihnen ermöglicht, sofort eine Funktion auf einem Return-Objekt aufzurufen. Dies wird auch als "Fluent Interface" bezeichnet.
// Unchained version $result = db_query("SELECT title FROM {node} WHERE nid = :nid", array(':nid' => 42)); $title = $result->fetchField(); // Chained version $title = db_query("SELECT title FROM {node} WHERE nid = :nid", array(':nid' => 42))->fetchField();
Eine Methode würde $this zurückgeben und wäre dann verkettbar in einem Fall, in dem es keinen anderen logischen Rückgabewert gibt.
In Fällen, die eine flüssige Schnittstelle der Klassen und eine Code-Spanne von mehr als einer Zeile haben, sollten die Methodenaufrufe 2 Leerzeichen haben
$query = db_select('node') ->condition('type', 'article') ->condition('status', 1) ->execute();
Routing in Drupal 8 ist ebenso wichtig
Das Drupal 8 Routing-System arbeitet mit dem Symfony HTTP-Kernel zusammen. Der Routing-Pfad hat hook_menu() in Drupal 7 ersetzt. Obwohl in Drupal 8 die Routing-Aufgabe stark von Symphony 2-Komponenten übernommen wird. Drupal 8 verwendet auch das YAML-Format. Alle Informationen über die Routen eines Moduls werden in der Datei MODULE_NAME.routing.yml gespeichert.
Das Routing-System ist dafür verantwortlich, Pfade mit dem Controller abzugleichen, und dann dürfen Sie diese Beziehungen in Routen verwenden. Die zusätzlichen Informationen können auch an Controller im Router übergeben werden.
Jede Route muss getrennt voneinander beschrieben werden, unter Einbeziehung dieser Eigenschaften:
- Name zur Identifizierung der Routen
- Pfad, der mit einem Schrägstrich beginnt
- Der Prozessor einer Route
- Bedingung, die den Zugriff auf die Route verwaltet
example.my_page: path: '/mypage/page' defaults: _controller: '\Drupal\example\Controller\ExampleController::myPage' _title: 'My first page in Drupal8' requirements: _permission: 'access content'
Example.my_page ist die Route in der .routing.yml-Datei. Die Route ist die Symfony-Komponente, die die HTTP-Anfrage abbildet, um die Konfigurationsvariable festzulegen. Unter Pfad geben wir den Pfad an, unter dem die Route registriert werden soll. Dies fungiert als URL zur Route
Erstellen einer "Controller-Klasse"
Es ist wichtig, die ModuleController.php gemäß dem PSR-4-Namensstandard zu erstellen. Sie müssen nur einen Ordner zusammen mit einem Dateinamen mit dem folgenden Inhalt erstellen.
<?php /** * @file * @author Rakesh James * Contains \Drupal\example\Controller\ExampleController. * Please place this file under your example(module_root_folder)/src/Controller/ */ namespace Drupal\example\Controller; /** * Provides route responses for the Example module. */ class ExampleController { /** * Returns a simple page. * * @return array * A simple renderable array. */ public function myPage() { $element = array( '#markup' => 'Hello world!', ); return $element; } } ?>
Ein Controller ist eine Art PHP-Funktion, die Sie erstellen. Er nimmt die Informationen aus der HTTP-Anfrage entgegen und erstellt oder beantwortet eine HTTP-Antwort.
Erstellen der ".module-Datei"
In Drupal 8 wird hook_menu() nur zum Definieren von Elementen verwendet. Wenn Sie ein hook_menu() haben, stellen Sie sicher, dass die Route und der Pfad in example.module mit example.routing.yml übereinstimmen.
Im Fall von Elementen und der Routenbeispiel sollte sich .module auf demselben Pfad befinden.
<?php /** * @File * Example custom module for Drupal 8. * @author Rakesh */ /** * Implementing hook_menu(). */ function example_menu() { // The paths given here need to match the ones in example.routing.yml exactly. $items['/mypage/page'] = array( 'title' => 'First page', 'description' => 'This is a example page.', // The name of the route from example.routing.yml 'route' => 'example.my_page', ); return $items; }
Fazit
So, das war's. Jetzt kennen Sie die Konzepte von OOP, um ein benutzerdefiniertes Modul zu erstellen. Ja, es ist wichtig, OOP, Designmuster, Twig und moderne PHP-Trends für die Erstellung der Module zu kennen, und Drupal macht Ihnen diese Aufgabe noch einfacher. Nicht wahr?
Wenn Sie nach weiteren guten Ressourcen und Referenzmaterial suchen, besuchen Sie OpenSense Labs, wo wir Dienstleistungen anbieten, die komplexe Webanwendungen mit relativer Leichtigkeit entwickeln. Ob es sich um die Entwicklung eines neuen benutzerdefinierten Moduls oder die Optimierung Ihrer neuen Website handelt, alles wird nach Ihren Bedürfnissen gehandhabt und zugeschnitten.
Kontaktieren Sie uns unter [email protected] für weitere Informationen und Referenzen zu diesem Thema.
Abonnieren
Verwandte Blogs
Zurück von der DrupalCon Atlanta 2025: Ein Meilenstein für OpenSense Labs

„Fit. Schnell. Für die Ewigkeit gebaut.“ Das war nicht nur ein Slogan, sondern die Denkweise, mit der wir zur DrupalCon…
Erklärbare KI-Tools: SHAPs Stärke in der KI

Wissen Sie, was erklärbare KI-Tools sind? Erklärbare KI-Tools sind Programme, die zeigen, wie eine KI ihre Entscheidungen…
KI-Chatbots: Präzision und Persönlichkeit in Perfektion

In der Welt der künstlichen Intelligenz ist die Entwicklung eines KI-Chatbots, der nicht nur akkurate Informationen liefert…