Erstellen und Verwenden von Drupal 8+ Services: Ein detaillierter Leitfaden mit praktischem Code
Drupal, das Open-Source-Content-Management-System, hat sich seit seiner Einführung stark weiterentwickelt. Mit der Veröffentlichung von Drupal 8 gab es eine massive Verschiebung in der zugrunde liegenden Architektur: die Einführung eines objektorientierteren Programmieransatzes unter Verwendung von Symfony-Komponenten. Eine bemerkenswerte Komponente, die in Drupal 8 eingeführt wurde, ist der Service-Container, der seitdem die Art und Weise, wie Module und Themes entwickelt werden, verbessert hat.
Dieser Artikel bietet einen tiefen Einblick in Drupal 8+ Services und wie sie zur Erstellung effizienter, modularer und wartbarer Codes genutzt werden können. Zusätzlich werden wir ein Beispielcode für ein besseres Verständnis durchgehen.
Was sind Drupal Services?
In Drupal 8+ sind Services wiederverwendbare Komponenten oder Objekte, die spezifische Funktionalitäten bereitstellen. Sie sind so konzipiert, dass sie dem Dependency Injection (DI) Design-Pattern folgen und werden normalerweise im Service-Container gespeichert. Dieses Design-Pattern ermöglicht es Ihnen, lose gekoppelten Code zu erstellen, was die Verwaltung und Wartung erleichtert.
Einige Beispiele für Drupal Services sind die Datenbankverbindung, der Entity Manager und der Renderer.
Erstellen eines benutzerdefinierten Services
Um einen benutzerdefinierten Service in Ihrem Modul bereitzustellen, müssen Sie eine services.yml-Datei im Stammverzeichnis Ihres Moduls erstellen. Diese Datei wird verwendet, um die Klasse Ihres neuen Services und alle Abhängigkeiten zu definieren, die er haben könnte. Alle Services werden als Instanzen von PHP-Klassen erstellt.
Schritt 1: Erstellen der services.yml-Datei
- Erstellen Sie zuerst eine YAML-Datei mit dem Namen ihrmodul.services.yml und ersetzen Sie „ihrmodul“ durch den Maschinennamen Ihres Moduls.
- Definieren Sie den Service in der YAML-Datei, einschließlich seiner Klasse und aller erforderlichen Services.
Hier ist eine Beispiel-services.yml-Datei:
services:
ihrmodul.sample_service:
class: Drupal\ihrmodul\SampleService
arguments: ['@database']
Schritt 2: Erstellen der Service-Klasse
- Erstellen Sie ein neues Verzeichnis unter src im Stammverzeichnis Ihres Moduls.
- Erstellen Sie innerhalb des src-Verzeichnisses eine PHP-Datei mit demselben Namen wie die in der YAML-Datei definierte Klasse. In unserem Beispiel wäre dies SampleService.php.
- Definieren Sie die Klasse in der neuen Datei, erweitern Sie alle erforderlichen Basisklassen und implementieren Sie alle benötigten Schnittstellen. Verwenden Sie Dependency Injection, um die Klasse zu konstruieren.
Hier ist eine Beispiel-SampleService.php-Datei:
// Definiert den Namespace für diese Klasse.
namespace Drupal\ihrmodul;
// Importiert die Klasse Drupal\Core\Database\Connection, damit sie innerhalb dieser Klasse verwendet werden kann.
use Drupal\Core\Database\Connection;
// Definiert eine Klasse namens SampleService.
class SampleService {
// Definiert eine Eigenschaft namens $database, auf die innerhalb dieser Klasse zugegriffen werden kann.
protected $database;
// Definiert eine Konstruktormethode, die ein Connection-Objekt entgegennimmt und es der $database-Eigenschaft zuweist.
public function __construct(Connection $database) {
$this->database = $database;
}
// Definiert eine Methode namens fetchAllUsers, die alle Benutzer aus der Tabelle 'users' in der Datenbank abruft.
public function fetchAllUsers() {
// Erstellt eine neue Select-Abfrage für die Tabelle 'users'.
$query = $this->database->select('users', 'u');
// Wählt die Felder 'uid', 'name' und 'mail' aus der Tabelle 'users' aus.
$query->fields('u', ['uid', 'name', 'mail']);
// Führt die Abfrage aus und ruft alle Ergebnisse als assoziatives Array ab.
return $query->execute()->fetchAll();
}
}
In diesem Beispiel haben wir einen einfachen benutzerdefinierten Service erstellt, der alle Benutzer aus der Datenbank abruft. Wie wir sehen können, haben wir Dependency Injection verwendet, um die Datenbankverbindung in den Service einzuspeisen.
Schritt 3: Verwenden des benutzerdefinierten Services
Der Zugriff auf Ihren benutzerdefinierten Service ist denkbar einfach. Verwenden Sie in Ihrem Modul, Theme oder einem anderen Service die Klasse \Drupal
, um Ihren benutzerdefinierten Service aufzurufen, wie folgt:
$sample_service = \Drupal::service('ihrmodul.sample_service');
$all_users = $sample_service->fetchAllUsers();
Und das ist alles! Sie haben erfolgreich einen benutzerdefinierten Service in Drupal 8+ erstellt.
Fazit
Drupal 8+ Services ermöglichen es Entwicklern, sauberen, wiederverwendbaren und gut abgegrenzten Code zu schreiben. Durch die Erstellung benutzerdefinierter Services und die Nutzung des Dependency Injection (DI) Design-Patterns können Entwickler modulare Funktionen und Erweiterungen für Drupal-Projekte effizient implementieren.
Mit einem besseren Verständnis von Drupal Services und etwas Beispielcode haben Sie nun die Werkzeuge, um Ihre eigenen benutzerdefinierten Services zu erstellen und die Wartbarkeit und Modularität Ihrer Drupal-Projekte zu verbessern.