Was ist der Entscheidungsbaum beim aktuellen D8-Status für das Erstellen eines neuen Inhaltsentitätstyps im Vergleich zum Erstellen eines Inhaltstyps für die Inhaltsentität „Node“?

24

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 )

Jon Freed
quelle

Antworten:

17

Entscheidungsbaum für die Auswahl, ob ein neuer Inhaltstyp vom Typ "Knotenentität" oder ein neuer Inhaltstyp vom Typ "Inhalt" erstellt werden soll:

  1. Sind Sie ein Programmierer oder haben Sie einfachen Zugang zu einem Programmierer?
    • Wenn dies nicht der Fall ist, können Sie derzeit nur neue Node-Entity-Inhaltstypen erstellen. (Im Core gibt es keine Benutzeroberfläche zum Erstellen neuer Entitätstypen für Inhalte, und das Contrib-Modul des Entity Construction Kit (ECK) verfügt derzeit nur über eine Alpha-Version.)
    • Wenn ja, fahren Sie fort ...
  2. Wissen Sie genau, welche Contrib-Module Sie für Ihre Daten nutzen möchten?
    • Wenn dies nicht der Fall ist, besteht die sichere Wette wahrscheinlich darin, nur einen Inhaltstyp für die Knotenentität zu erstellen.
    • Wenn ja, unterstützen diese Module bereits die von Ihnen in Betracht gezogenen benutzerdefinierten Entitätstypen, oder sind Sie bereit, sie zu erweitern, damit sie die gewünschte Funktionalität in Ihrem Modul wiederherstellen können?
      • Wenn nein, ist es möglicherweise am besten, nur einen Inhaltstyp vom Typ "Knotenentität" zu erstellen.
      • Wenn ja, fahren Sie fort ...
  3. Werden die tatsächlichen Inhaltsdaten, die von Ihrem Modul aktiviert werden, lediglich dazu beitragen, andere Inhaltsdaten zu gruppieren oder mit Anmerkungen zu versehen? (Damit es nur selten alleine betrachtet wird.)
    • Wenn ja, prüfen Sie, ob Ihr Modul den vorhandenen Entitätstypen für Taxonomiebegriffe und -kommentare entspricht. Wenn dies der Fall ist, kann ein neuer Entitätstyp eine sichere Wette sein.
    • Wenn nein, fahren Sie fort ...
  4. Können Sie klar artikulieren, warum ein neuer Inhaltstyp vom Typ "Knotenentität" für Sie nicht funktioniert?
    • Wenn dies nicht der Fall ist, sollten Sie wahrscheinlich nur einen neuen Inhaltstyp vom Typ "Knoten-Entität" erstellen.
    • Wenn ja, fahren Sie fort ...
  5. Sind Sie schließlich sicher, dass Sie den Node-Entity-Typ nicht einfach erweitern können und alle nützlichen Funktionen wie CRUD-Operationen neu erstellen möchten?
    • Wenn ja, erstellen Sie einen neuen benutzerdefinierten Entitätstyp.
    • Wenn nein oder wenn Sie sich nicht sicher sind, möchten Sie wahrscheinlich einige Experten hinzuziehen, die Ihnen bei der Entscheidung helfen.

Anmerkungen:

  1. Dieser Entscheidungsbaum berücksichtigt weder die Leistung noch die Sicherheit. Ich bin nicht sicher, ob oder wann ein neuer benutzerdefinierter Entitätstyp eine bessere Leistung erzielen und mehr oder weniger sicher sind als ein Entitätstyp "Knoten".
  2. Auch wenn dieser Baum eine gute Antwort ist, wird er aufgrund von Aktualisierungen im Drupal-Kern und Contrib-Modul-Releases wahrscheinlich nicht so bleiben. StackExchange scheint nicht zu berücksichtigen, dass die "beste" Antwort von heute möglicherweise nicht die beste Antwort von morgen ist.)
Jon Freed
quelle
1
interessante Frage und eindrucksvolle Antwort, Chapeau! (oeps: hüte ab!). Zu dem Teil "Sicherheit" in Ihrer Anmerkung (1): Würde sich die Gruppe (= eine Variation von "og" für D8) dafür qualifizieren?
Pierre.Vriens
@ Pierre.Vriens, merci beaucoup! Der "Sicherheits" -Teil von Anmerkung (1) wurde durch einen Beitrag an einer Stelle (an der ich mich nicht erinnere, wo) veranlasst, dass das Erstellen vieler neuer Inhaltstypen anstelle neuer Entitätstypen die Wahrscheinlichkeit erhöhen würde, dass Sie versehentlich einen bestimmten Inhaltstyp verfügbar machen Daten. Vielen Dank für den Hinweis auf Group. Es erleichtert definitiv die Erstellung neuer Entitäten, indem es eine vorgefertigte Alternative zur Sicherheitsfunktionalität bietet, die möglicherweise nur für Knoteninhaltstypen gilt. Daher könnte es für Entwickler von Entitätstypen unnötig sein, Sicherheitsfunktionen selbst zu erstellen.
Jon befreit
3

Ein einfacher Ansatz zu diesem Thema besteht darin, den Projektzweck, die Größe und die Geschäftsanforderungen zu berücksichtigen.

  1. Wie sich der standardmäßige Inhaltstyp einer Knotenentität auf die Erstellung des Projekts auswirkt, und zwar auf eine einfache und übersichtliche Weise, die näher an der Architektur und den Datenflüssen liegt, die sich aus dem analytischen Denken von Projektdokumenten ergeben.

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.

  1. 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.

  2. 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.

Mohammed Gomma
quelle
3

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.)

Wenn Sie einen Autor und einen veröffentlichten Status haben , sollten Sie sich für einen Inhaltstyp entscheiden.


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

Meiner Ansicht nach ist dies eine klarere und übersichtlichere Architektur (und auch performanter).

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:

  • Um die 'Entität' zu übersetzen (zumindest in D7), gäbe es auch eine Schnittstelle.
  • (offen für Vorschläge) ..
rémy
quelle
3

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:

  • Artikel
  • Seite
  • Stellenausschreibung
  • Veranstaltung
  • Zielseite
  • Startseite

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:

  • Produkt (Drupal Commerce)
  • Werbebuchung (Drupal Commerce)
  • Suchserver (ApacheSolr / SearchAPI)
  • Kontakt (wie CRM-Lead)
  • Ticket (wie Support Ticket)

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.

Kevin
quelle