Entity API implementiert die Typed Data API
Erhebliche Verbesserung
- Entity API implementiert nun die API Typed Data
In dieser neuen Umsetzung der Entity API ist alles ein Feld, das auf derselben API basiert, wodurch Entities vorhersehbar und konsistent sind.
VerstÀndnis des Drupal-Datenmodells
ZunĂ€chst, bevor wir in die Typed Data API eintauchen, mĂŒssen wir verstehen, wie das Drupal-Datenmodell (Entity API) bisher wahrgenommen wurde. Das ist wichtig, denn von hier aus stammt die Typed Data API, und Entity API ist eines der Systeme, fĂŒr die sie entwickelt wurde.
Eine Entity ist ein komplexes Datenobjekt, das aus anderen Datenobjekten besteht, wie Feldern mit einer Liste von Elementen. Ein Feldelement ist ebenfalls komplex â es besteht aus weiteren Datenfragmenten, wie z.B. einem Textwert und einem Eingabeformat. Die KomplexitĂ€t endet jedoch so, dass man etwas als primitiven Datentyp beschreiben kann, wie String oder Integer.
Vereinfachtes Beispiel aus Drupal 7 (ohne Sprachkennung, da Drupal 8 das anders handhabt):
Beispiel 1
// Entities sind komplex, sie enthalten andere DatenstĂŒcke. $entity; // Felder sind nicht komplex, sie enthalten nur eine Liste von Items. $entity->image; // Items sind komplex, sie enthalten weitere DatenstĂŒcke. Sie sind auch ĂŒbersetzbar und zugriffsberechtigt. $entity->image[0]; // Die Dateiid ist ein primitiver Integer. $entity->image[0]['fid']; // Der Alternativtext ist ein primitiver String. $entity->image[0]['alt'];
Alles zusammengefĂŒhrt
Nachfolgend ein vereinfachtes Beispiel, wie Entity API Interfaces implementiert, die sich von der Typed Data API unterscheiden. TatsĂ€chlich erweitert die Entity API diese Interfaces, indem sie zusĂ€tzliche Methoden hinzufĂŒgt, die fĂŒr Entity API notwendig sind. Trotzdem sind alle untenstehenden Aussagen wahr:
Beispiel 2
// Entities sind komplex. $entity instanceof ComplexDataInterface; // Properties sind nicht komplex, sie sind nur eine Liste von Items. $entity->get('image') instanceof ListInterface; // Items sind komplex. $entity->get('image')->offsetGet(0) instanceof ComplexDataInterface; // Das Typed Data Objekt, das den alt-Wert reprÀsentiert. $entity->get('image')->offsetGet(0)->get('alt') instanceof TypedDataInterface; // Der alt-Wert ist ein primitiver String. is_string($entity->get('image')->offsetGet(0)->get('alt')->getValue());
Hier eine kurze Ăbersicht, wie Entity API die Typed Data API erweitert, um einige weitere BedĂŒrfnisse zu erfĂŒllen:
Beispiel 3
interface EntityInterface extends ComplexDataInterface, TranslatableInterface, AccessibleInterface { // ... } interface FielditemListInterface extends ListInterface { // ... } // Beachten Sie, dass dieses Interface zwei Interfaces erweitert. ErklÀrung folgt unten. interface FieldItemInterface extends ComplexDataInterface, TypedDataInterface { // ... } // Einige tatsÀchliche Implementierungen folgen. // Erweitert eine abstrakte Klasse mit allgemeiner Logik. class ImageItem extends FieldItemBase { // ... } // Erweitert eine abstrakte Klasse mit allgemeiner Logik. class String extends TypedData { // ... }
[Die folgenden zwei AbsĂ€tze erfordern noch Ăberarbeitung]
Zwei auffÀlligste Punkte oben:
1. EntityInterface erweitert einige Service-Interfaces fĂŒr Dinge wie Ăbersetzung und Zugriffsrechte. Das sollte ziemlich offensichtlich sein.
2. FieldItemInterface erweitert sowohl ComplexDataInterface als auch TypedDataInterface. Wie oben erklĂ€rt, sind Items komplex, weil sie weitere Datenfragmente enthalten (z.B. Textwert und Format fĂŒr Textfelder). Gleichzeitig ist ein Item selbst ein Teil typisierter Daten und hat daher seine eigene Definition und Datentyp.
Zusammenfassend sind zusÀtzlich zu Beispiel 2 auch die folgenden Aussagen wahr:
Beispiel 4
$entity instanceof EntityInterface; $entity->get('image') instanceof FieldItemListInterface; $entity->get('image')->offsetGet(0) instanceof FieldItemInterface; $entity->get('image')->offsetGet(0)->get('alt') instanceof String; is_string($entity->get('image')->offsetGet(0)->get('alt')->getValue());
API-Nutzung
[In diesem Abschnitt werden noch weitere Beispiele benötigt]
Entity API definiert einige magische Methoden wie __get(), um schnellen und einfachen Zugriff auf Feldwerte zu ermöglichen. Dadurch ist die Nutzung der API sehr einfach, und die Syntax Àhnelt der Zeit vor Drupal 8.
Das tatsÀchliche Auslesen des Alternativtextwertes eines Bildes sieht so aus:
Beispiel 5
// Die ausfĂŒhrlichste Variante. $string = $entity->get('image')->offsetGet(0)->get('alt')->getValue(); // Mit von Entity API hinzugefĂŒgtem Magic. $string = $entity->image[0]->alt; // Noch mehr Magic von Entity API, das standardmĂ€Ăig das erste Item aus der Liste holt. $string = $entity->image->alt;
Das obige Beispiel fĂŒgt lediglich eine angenehmere Syntax zum alten API hinzu. Die folgenden Beispiele zeigen, wo der wirkliche Wert dieser API liegt â bei der Datenvalidierung:
Beispiel 6
// Gibt ein Array mit benannten Keys fĂŒr alle Felder und deren // Definitionen zurĂŒck, z. B. fĂŒr das Feld âimageâ. $property_definitions = $entity->getFieldDefinitions(); // Gibt ein Array mit benannten Keys fĂŒr alle Properties und deren // Definitionen zurĂŒck, z. B. fĂŒr die Properties âfile_idâ und âaltâ. $property_definitions = $entity->image ->getFieldDefinition() ->getFieldStorageDefinition() ->getPropertyDefinitions(); // Gibt nur die Definition fĂŒr die Property âaltâ zurĂŒck. $string_definition = $entity->image ->getFieldDefinition() ->getFieldStorageDefinition() ->getPropertyDefinition('alt');
Basierend auf den obigen Definitionen können wir nun intelligente Dinge tun, wie Serialisierung oder andere Datenarray-Operationen. Wir können diese Daten auch ĂŒber semantisch reiche APIs bereitstellen, wie JSON-LD-Endpunkte, damit andere Systeme die Grundlagen unserer Daten verstehen.
Siehe https://drupal.org/node/2078241 fĂŒr weitere Informationen zum Definieren und Nutzen von Field Definitions fĂŒr Entity Types.
Drupalâs online documentation is © 2000-2020 by the individual contributors and can be used in accordance with the Creative Commons License, Attribution-ShareAlike 2.0. PHP code is distributed under the GNU General Public License.