Eigene Content Entity Types mit "drush generate" erstellen

Drupal wird häufig ausschließlich als Content-Management-System gesehen. Neben der – leistungsstarken CMS-Funktionen – eignet sich Drupal auch hervorragend als Web-Application-Framework. Sprich, für die Realisierung aller möglichen Anwendungen. So habe ich bereits an Drupal Projekten gearbeitet in denen ausschließlich interne Geschäftsprozesse abgebildet und gesteuert wurden. Oder auch Kombinationen, wo einzelne Teile bzw. Ergebnisse aus vorhergegangenen Prozessen auf der Website ausgespielt wurden.

Solche Multi-Purpose-Projekte bestehen jedoch selten nur aus Artikeln, Seiten und Abschnitten. Es werden vollwertige, eigene Datenstrukturen benötigt, um die jeweilige Business-Logik adäquat umsetzen zu können. Die Standard-Lösung hierfür sind in Drupal die Custom (Content) Entity Types. Genau genommen sind Nodes (also Artikel, Seiten, …) selbst eigentlich nur ein Content Entity Type (vom Typ "Node") – nur halt vom Drupal Core standardmäßig bereitgestellt.

Content Entity vs. Node Type

An dieser Stelle möchte ich nur kurz darauf eingehen, wann lieber auf eine Custom Content Entity zurückgegriffen werden sollte und wann auf einen (neuen) Node Type. Wie im vorangegangenen Abschnitt bereits beschrieben, sind Nodes auch nur eine Content Entity Type. Und ein Node Type wiederum ist ein Bundle dieses Entity Types. Da Node Types bestimmte Felder standardmäßig vom Entity Type erben (wie z.B. Titel, Erstellt- und Bearbeitet-Datum, ...) und per Administrationsoberfläche um zusätzliche Felder erweitert werden können, ist der Einsatzzweck zu programmierten Custom Entity Types sehr ähnlich. Es gibt jedoch im Detail einige gravierende Besonderheiten und Unterschiede.

Eigenen Content Entity Type erstellen

Das manuelle Anlegen von solchen Entity Types ist ziemlich aufwendig, da eine Menge an Dateien erstellt und angepasst werden müssen. Mit der Drupal Console gab es früher ein Werkzeug, um solche Entity Types und andere Drupal Komponenten als Boilerplate Code zu generieren. Allerdings ist die Entwicklung der Drupal Console mehr oder weniger eingestellt.

Inzwischen bietet aber auch Drush – das Schweizertaschenmesser für Drupal – die Möglichkeit, fertigen Code für Drupal zu generieren. Unter anderem auch: Content Entity Types.

Drush generiert den benötigten Code

Das generelle Kommando für Drush lautet: drush generate

Ausgehend von einer funktionieren Drupal-Installation muss ggf. noch Drush installiert werden:

composer require drush/drush

Nach der Installation kann direkt der erste eigene Content Entity Type erstellt werden:
drush gen content-entity

Das Kommando führt anschließend Schritt für Schritt durch den Erstellungsprozess. Nach der Beantwortung von ein paar Fragen und anschließend wird der fertige Code generiert. Unter anderem kann direkt angegeben werden, ob ein Entity Type fieldable, revisionable und/oder übersetzbar sein soll.

drush gen content-entity

 Welcome to content-entity generator!
––––––––––––––––––––––––––––––––––––––

 Module machine name [web]:
 ➤ test_module

 Entity type label [Test module]:
 ➤ Test Entity Type

 Entity type ID [test_entity_type]:
 ➤ 

 Entity base path [/test-entity-type]:
 ➤ 

 Make the entity type fieldable? [Yes]:
 ➤ 

 Make the entity type revisionable? [No]:
 ➤ 

 Make the entity type translatable? [No]:
 ➤ 

 The entity type has bundle? [No]:
 ➤ 

 Create canonical page? [Yes]:
 ➤ 

 Create entity template? [Yes]:
 ➤ 

 Create CRUD permissions? [No]:
 ➤ 

 Add "label" base field? [Yes]:
 ➤ 

 Add "status" base field? [Yes]:
 ➤ 

 Add "created" base field? [Yes]:
 ➤ 

 Add "changed" base field? [Yes]:
 ➤ 

 Add "author" base field? [Yes]:
 ➤ 

 Add "description" base field? [Yes]:
 ➤ 

 Create REST configuration for the entity? [No]:
 ➤ 

 The following directories and files have been created or updated:
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
 - /srv/http/public/htdocs/web/modules/custom/test_module/test_module.links.action.yml
 - /srv/http/public/htdocs/web/modules/custom/test_module/test_module.links.contextual.yml
 - /srv/http/public/htdocs/web/modules/custom/test_module/test_module.links.menu.yml
 - /srv/http/public/htdocs/web/modules/custom/test_module/test_module.links.task.yml
 - /srv/http/public/htdocs/web/modules/custom/test_module/test_module.module
 - /srv/http/public/htdocs/web/modules/custom/test_module/test_module.permissions.yml
 - /srv/http/public/htdocs/web/modules/custom/test_module/test_module.routing.yml
 - /srv/http/public/htdocs/web/modules/custom/test_module/src/TestEntityTypeAccessControlHandler.php
 - /srv/http/public/htdocs/web/modules/custom/test_module/src/TestEntityTypeInterface.php
 - /srv/http/public/htdocs/web/modules/custom/test_module/src/TestEntityTypeListBuilder.php
 - /srv/http/public/htdocs/web/modules/custom/test_module/src/Entity/TestEntityType.php
 - /srv/http/public/htdocs/web/modules/custom/test_module/src/Form/TestEntityTypeForm.php
 - /srv/http/public/htdocs/web/modules/custom/test_module/src/Form/TestEntityTypeSettingsForm.php
 - /srv/http/public/htdocs/web/modules/custom/test_module/templates/test-entity-type.html.twig

Fazit: Was drush generate uns abnimmt

Neben der ganzen gesparten Handarbeit erledigt drush generate folgendes:

  • Generiert die Entity PHP Klasse mit den notwendigen Annotations
  • Generiert das Formular zum Erstellen/Bearbeiten von Entities (CRUD Operations)
  • Generiert die Zugriffssteuerung und Berechtigungen (auf Wunsch mit CRUD Permissions)
  • Generiert die notwendigen Menü-Einträge (Action, Contextual, Menu und Task Links)
  • Generiert die hook Implementierungen (*.module) und Template (*.html.twig) für die Darstellung der Entities

Trotzdem generiert drush generate nur die Basis für unseren Entity Type. Anschließend müssen ggf. die Route Pfade angepasst und die benötigten Felder in der Entity Klasse (baseFieldDefinitions()) ergänzt bzw. definiert werden.

Eine gute Übersicht über die (standardmäßig) vorhandenen Feld-Typen, Widgets und Formatters bietet die drupal.org Dokumentation.

Profile picture for user cbeier
Autor

Christian Beier

Hi, ich bin Christian! Ich unterstütze Unternehmen dabei ihre Geschäftsanwendungen und Prozesse zu digitalisieren. Hier blogge ich über Drupal, Webentwicklung, Digitalisierung, Projektmanagement und andere Themen, die mich interessieren. Per RSS abonnieren. Schreibe mir eine Mail an [email protected] oder folge mir auf LinkedIn oder Mastodon.