Wir haben die erste Veröffentlichung von Drupal 8 vor vier Jahren gesehen, seit die akzeptierte Antwort für die Frage geschrieben wurde: " Wann ist es angebracht, eine Entität zu erstellen, anstatt nur einen neuen Inhaltstyp hinzuzufügen ?" Entitäten spielen in Drupal 8 eine wichtigere Rolle als in Drupal 7. ( RefB , RefC , RefD )
Was ist in dieser neuen Drupal 8-Welt der Entscheidungsbaum für das Erstellen eines neuen Inhaltsentitätstyps im Vergleich zu einem neuen Inhaltstyp für die Inhaltsentität vom Typ "Knoten"?
Wenn Sie eine Antwort erwägen, beachten Sie bitte Folgendes:
- Ist ein neuer Inhaltstyp für den Inhaltsentitätstyp "Knoten" in 99% der Fälle im Vergleich zu einem neuen Inhaltsentitätstyp noch angemessen?
- Enthält der Entscheidungsbaum jetzt mehr, bessere oder klarere Gründe, um von der Verwendung des Inhaltsentitätstyps "Knoten" abzuweichen und stattdessen einen neuen Inhaltsentitätstyp zu erstellen? Und wenn ja, was sind sie? Umfassen sie:
- Performance?
- Sicherheit / Berechtigungen?
- Die Anzahl der Module, die mit Inhaltstypen vom Typ "Knotenentität" und mit anderen Inhaltstypen nicht kompatibel sind?
- Basierend auf der zuvor akzeptierten Antwort, auf die oben verwiesen wurde, ist der einzige allgemeine Grund, einen benutzerdefinierten Inhaltsentitätstyp zu erstellen, möglicherweise, dass Sie Knotendaten gruppieren möchten, z. B. mit Taxonomiebegriffen, oder Knoten anderweitig mit Anmerkungen versehen möchten, z.
Die Modulkompatibilität scheint eine besonders interessante Überlegung für einen Entscheidungsbaum zu sein. Derzeit haben nur wenige der am häufigsten installierten Module ein Release für 8.x, das nicht nur Alpha, Beta oder RC (ein Release-Kandidat) ist. Und es scheint schwierig zu sein, zu bestimmen, wie viele von ihnen mit einem neuen benutzerdefinierten Entitätstyp im Vergleich zu einem neuen Node-Entity-Inhaltstyp sofort funktionieren. Es scheint kein Projektattribut zu geben, das zwischen den Attributen "Geschrieben für Entitäten" und "Geschrieben für Inhaltstypen von Knotenentitäten" unterscheidet.
Werfen Sie einen Blick auf pathauto, das derzeit das vierthäufigste installierte Modul aller 8.x-Versionen ist. Die Leute arbeiten hart an einer 8.x-Version, die im Allgemeinen Entitäten und nicht nur Inhaltstypen vom Typ "Knoten-Entität" unterstützt. Aber was ist mit all den anderen Modulen? Und werden Module, die Entitäten unterstützen, in der Regel modulspezifische "Hooks" für benutzerdefinierte Inhaltsentitätstypen benötigen, bevor das Modul mit ihnen arbeiten kann? (Im Vergleich dazu, wie die Module bei neuen Inhaltstypen möglicherweise sofort funktionieren?) Dies scheint die Herausforderung zu sein, mit der das pathauto-Team arbeitet, und es ist möglicherweise ein Grund, von einem benutzerdefinierten Inhaltstyp abzuweichen.
Erwähnenswert ist auch, dass Drupal 8 Core eine Benutzeroberfläche zum Erstellen neuer Inhaltstypen für die Inhaltsentität vom Typ "Knoten" enthält, derzeit jedoch keine Benutzeroberfläche zum Erstellen neuer Inhaltsentitätstypen. ( RefX , RefY , RefZ )
Ein einfacher Ansatz zu diesem Thema besteht darin, den Projektzweck, die Größe und die Geschäftsanforderungen zu berücksichtigen.
Ein wichtiger Hinweis hierbei ist die Entscheidung, einen neuen Entitätstyp zu erstellen, die normalerweise von Entwicklern oder technischen Leads getroffen wird, nicht von Site Buildern oder Projektbesitzern, die die Anwendung verwalten und sich nur auf das Geschäft konzentrieren.
Drupal 8 hängt von einigen symfony2-Paketen ab und ist Frameworks ähnlicher, und ich stelle mir vor, dass die Erstellung einer neuen Entität besser ist, als viele Anpassungen und komplexe Konfigurationen über Inhaltstypen von Knoten-Entitäten in der Reihenfolge vorzunehmen um Drupal unter anderen Frameworks zu nutzen, da viele Leute die Art und Weise, wie Drupal konfiguriert und verteilt wird, nicht mögen. Einige Leute stammen möglicherweise aus WordPress und werden verwendet, um alles aus einer Form heraus zu konfigurieren, was sie beim Umgang mit dem Drupal-Administrator-Dashboard verärgert.
Drupal 9 plant, das Hook-System vollständig zu entfernen und durch den Event-Dispatcher zu ersetzen , was dazu führt, dass eine Administrationsoberfläche zum Erstellen einer neuen Entität dringend benötigt wird, da das Ändern der vorhandenen Funktionalität von Code für Leute, die keine Entwickler sind und für die dies sehr wichtig ist, viel schwieriger wird füge diese Funktion hinzu.
Am Ende sehe ich, dass neue Entitäten, die auf die Projektanforderungen zugeschnitten sind, eine bessere Leistung als komplexe Inhaltstypen mit einer großen Anzahl von Feldern bieten, da jetzt jedes Feld der DB 2 Tabellen hinzufügt und seine Konfiguration bei jeder Anforderung geladen werden muss, insbesondere bei der Schwere Geschäftslogik erforderlich.
quelle
Schlicht und einfach: Es ist nicht alles Inhalt. Die Liste der Inhalte kann sehr lang und verwirrend sein, wenn Sie nur Inhaltstypen verwenden. ( ContentEntityBase kann auch von einer benutzerdefinierten Entität implementiert werden.)
Andernfalls (vorausgesetzt, Sie sind Programmierer) sollten benutzerdefinierte Entitäten bevorzugt werden. Mit allen Schnittstellen (wie revisionsfähig, feldfähig, Zugriffsbeschränkung etc.) kann vieles einfach implementiert werden
Wenn man an die Wiederverwendbarkeit in mehreren Projekten denkt , gibt es auch nützliche Helfer wie den Drupal-Code-Generator . Um die benutzerdefinierte Codierung (oder Komplexität) auf einem niedrigen Niveau zu halten, sollten Sie die Verwendung von Inhaltstypen in Betracht ziehen, wenn Sie Folgendes möchten:
quelle
Es ist eine schwierige Frage, die ehrlich gesagt meines Erachtens erst verstanden wird, wenn Sie sie zuvor implementiert haben. Aber wie ich bereits sagte, ist nicht alles roher Inhalt, dem Benutzer zugewandt .
In Drupal 7 gab es die Möglichkeit, benutzerdefinierte Entitäten zu erstellen, dies könnte jedoch eine entmutigende Aufgabe sein, wenn Sie mit OOP an den Rändern herumgingen. Es wurde halb implementiert (oder halb fertig, wie auch immer Sie es sagen möchten), was dazu führte, dass Entitäten geschaffen wurden, die nicht alle genau einheitlich waren und sich auf Ansätze verständigten, mit gemischten Prozeduren und gemischten OOP.
In Drupal 8 wird die Idee viel mehr verwirklicht und es ist viel einfacher, eine benutzerdefinierte Entität in Betrieb zu nehmen. Der Knoten selbst basiert auf ContentEntityBase, ebenso wie Blöcke, Benutzer, Dateien und Taxonomie.
Knoten sind speziell für veröffentlichte, sichtbare (oder autorisierte) Inhaltsdaten gedacht, die normalerweise als Inhalt fungieren (dh in einem Menü oder in der Sitemap oder XML-Sitemap oder RSS-Feeds usw.). Drupal wurde so konzipiert, dass Sie sich in jeden Schritt des Knotenoperationsprozesses einklinken und ihn ändern können, was unbeabsichtigte Konsequenzen haben kann, wenn Sie die falsche Mischung der beigestellten Module haben. Dies ist wahrscheinlich eine kontroverse Meinung, aber es hilft, sich von der Idee "Alles ist ein Knoten" zu lösen, um das Konzept der Entität besser zu verstehen.
Ideale Inhalte für großartige Inhaltstypen:
Ihnen ist gemeinsam, dass sie das Konzept einer Art von Inhalt teilen. Es befindet sich in der Regel in einer beliebigen Anzahl von Workflow-Zuständen (veröffentlicht, beworben, dauerhaft, archiviert, funktionsfähig usw. - wenn Sie benutzerdefinierte Veröffentlichungsoptionen verwenden), und eine große Anzahl von Modulen, die dazu beigetragen haben, interagieren direkt damit, wie Pathauto.
Nehmen wir jedoch an, Sie möchten Daten in Drupal speichern, die intern oder privat sind, auf andere Daten zugreifen oder die eine Integration außerhalb ihres Gültigkeitsbereichs nur zulassen, wenn Sie dies zulassen. Welche Art von Daten könnte dies sein? Hier sind einige mögliche Typen:
Was macht diese so anders? Warum möchten Sie eine Entität für den Kontakt, anstatt das Benutzermodell zu verwenden? Sie könnten dort ein paar Argumente vorbringen, aber mein Beispiel wäre, dass Sie, wenn Sie sagen, E-Mail-Adressen und Namen sowie einige andere Metadaten aus einem Kontaktformular sammeln, diese Daten als benutzerdefinierte Entität speichern. Sie verhindern, dass die Benutzerliste mit Nicht-Konto-Elementen verschmutzt wird, Sie verringern potenzielle Sicherheitsprobleme (was passiert, wenn ein Skript oder jemand diese Konten versehentlich aktualisiert, um Administratoren zu werden oder eine Massenmail zu senden?), Sie führen eine interne Verwaltung des tatsächlichen Benutzers durch Konten einfacher und Sie segmentieren, was Sie erfassen, um was es ist, ein spezialisiertes Stück Daten.
Von hier aus ist es weitgehend von den eher automatischen Teilen des Drupal / Node-Systems getrennt und Sie können die Aktionen und Erfahrungen anpassen. Sie bestimmen die Routen, den Zugriff und den CRUD-Workflow.
In dieser Denkweise ist es einfacher zu verstehen, warum dies so geschehen würde. Nehmen wir das Beispiel für ein Support-Ticket: Es handelt sich um eingehende Anfragen, aber nicht um veröffentlichte Daten. Wahrscheinlich handelt es sich um einen sehr spezifischen Workflow, der einfacher einzurichten ist, als sich von Teilen des Knotensystems zu trennen, die nicht eingehalten werden sollen zu.
Ein anderes Beispiel wären externe, importierte Daten. In den meisten Fällen werden diese Daten normalerweise nicht mit lokalen Drupal-Daten angereichert (auch wenn es sich um eine Entität handelt, können Sie dies dennoch tun). Es könnte alles sein. Vielleicht sind es Rechnungen, vielleicht sind es Bücher, vielleicht werden Biermarken gezogen.
Daten wie diese sind in der Regel spezifisch und erfordern eine Kontrolle, die über den jeweiligen Knoten hinausgeht. Das heißt nicht, dass Sie es nicht erweitern können, indem Sie ein Referenzfeld auf einem Knoten verwenden, um auf Ihre benutzerdefinierte Entität zu verweisen (so hat Drupal Commerce auf einer bestimmten Ebene gearbeitet), um die Daten anzureichern. Gleichzeitig isolieren Sie und stellen sicher, dass die Kontrolle über Ihre Daten und die Benutzeroberfläche von fehlerhaftem Contrib-Code ausgeht, der über das Design hinausgeht und Ihr Modell beeinträchtigt. Dies ist wahrscheinlich weniger ein Problem in D8 als in D7, obwohl einige Haken bleiben.
Die richtige Architektur existiert jetzt, um die Trennung zu fördern. Nicht alles ist ein Knoten.
quelle