Ich stelle fest, dass das größte Problem bei der Arbeit mit Drupal 8 darin besteht, dass ich nicht die Daten erhalten kann, die ich benötige. Drupal 8 möchte, dass ich öffentliche Methoden verwende, anstatt manuell durch ein Objekt zu bohren. Das Problem ist, ich kann keinen konsistenten Weg finden, um eine Liste der verfügbaren Methoden zu erhalten! (Sie existieren auf magische Weise und ich habe das Gefühl, ich sollte nur etwas über sie wissen.) =
Angenommen, ich habe einen Inhaltstyp mit einem Videofeld. Ich muss die unformatierte URL der Videodatei in diesem Feld abrufen.
Also würde ich mit einer Knoten-ID ($ nid) beginnen und irgendwie muss ich herausfinden, wie der Knoten geladen wird. Das ist nicht schlecht, denn es gibt viele Beispiele. Also mache ich so etwas $node = \Drupal\node\Entity\Node::load($nid);
.
So weit, ist es gut. Dann muss ich den Wert meines Videofeldes (field_main_video) abrufen. Ich brauchte für immer, um das herauszufinden, weil es im Internet widersprüchliche Dokumentationen gibt. Schließlich habe ich herausgefunden, dass ich so etwas tun muss (weil es ein mehrwertiger Gegenstand ist):
$video = \Drupal\node\Entity\Node::load($nid)->field_main_video->getValue();
... dann Schleife durch das Array usw. Die Verwendung von kint hat mir auch nicht geholfen, dies zu finden. Wenn ich zum Beispiel kint($node)
unter Methoden nachschaue, sehe ich dort getValue () nicht als Element. Immer noch nicht schrecklich, denn es gab genug Beispiele, um es herauszufinden.
Als ich jedoch tiefer ging, wusste ich nicht (dies ist der wichtige Teil), dass ich nicht die Entitäts-ID des Videofelds abrufen, dann die Entität laden und dann das "uri" -Feld in der Entität usw. finden sollte (wie z Ich würde in D7): Es gab eine Methode, mit der ich den URI alle in derselben Codezeile erhalten kann!
$url = \Drupal\node\Entity\Node::load($nid)->field_main_video->entity->getFileUri();
Aber wie hätte ich wissen können, dass getFileUri () existiert? Ich bin zufällig in einem Blog-Beitrag darauf gestoßen. Dies macht es wirklich einfacher, eine URI zu erhalten als in D7 ... aber nur, wenn Sie (auf magische Weise) wissen, welche Methoden für jede 'Ebene' eines Objekts existieren.
Am Ende frage ich mit diesem Beispiel: Wie finden Sie alle öffentlichen Methoden für jede Ebene eines Objekts auf eine Weise, die leicht zu lesen und zu verstehen ist? Beachten Sie, dass es anscheinend eine drupal-zentrierte (dh Entwicklungsmodul) Methode geben sollte, um dies zu tun, anstatt api.drupal.org manuell zu durchsuchen oder etwas IDE-spezifisches zu verwenden?
Antworten:
Inhalt Einheiten unterscheiden sich von den meisten anderen Dinge, dass sie oft nicht Methoden und geeignete Schnittstellen, zumindest nicht für konfigurierbare Felder aus .
Bei Inhaltsentitäten und Feldern sind öffentliche Methoden nicht das, was Sie tatsächlich wissen möchten, sondern das, was Sie über Felder und Eigenschaften wissen möchten. Und nur wenn Sie über eine Referenz wieder zu einer Entität gelangen, sind die Methoden von Bedeutung.
Für eine Übersicht verweise ich immer auf das großartige Entity API Cheat Sheet .
Inhaltsentitäten haben eine feste Struktur: Entität> Feld (FieldItemList)> FieldItem -> Eigenschaft. Eine Eigenschaft ist entweder skalar oder eine Referenz auf etwas anderes, z. B. eine andere Entität, ein Sprachobjekt, ein Datumsobjekt, ...
Für einige Beispiele einige nützliche Ausschnitte:
quelle
Ich bin mir nicht sicher, ob dies Ihre Frage vollständig beantworten wird, aber was mir sehr hilft, ist die Verwendung der Diagrammfunktion in PhpStorm.
Zum Beispiel die Hierarchie zeigen
Sie haben die Möglichkeit, auch Methodennamen anzuzeigen
Ich hoffe das hilft dir irgendwie.
quelle
Nun, ich habe ziemlich oft die Kombination verwendet
var_dump(get_class_methods($object))
, um eine Liste der verfügbaren Methoden für die gegebene Klasse zu haben.Ich suche auch ziemlich oft nach
api.drupal.org
weiteren Details.quelle
Du bist schon sehr nah.
Schauen wir uns zunächst die Definition der Methode an: https://api.drupal.org/api/drupal/core%21modules%21file%21src%21Entity%21File.php/function/File%3A%3AgetFileUri/8.2.x
Von hier aus können wir die Klasse sehen, zu der dies gehört, und es gibt einen Link dazu:
Durch Klicken gelangen wir zu: https://api.drupal.org/api/drupal/core%21modules%21file%21src%21Entity%21File.php/class/File/8.2.x
In Ihrer IDE können Sie auch nach der
\Drupal\file\Entity\File
Klasse suchen . Eine Möglichkeit, um sicherzustellen, dass dies die richtige Klasse ist, besteht darin, sich die Anmerkung anzusehen:Beachten Sie das
id
- es istfile
. Vermutlich könnten Sie sich beim Debuggen den Inhalt vonfield_main_video->entity
ansehen und diese ID irgendwo sehen. Dann suchen Sie einfach in Ihrer IDE danach. Normalerweise weiß man jedoch genug über die Entitätstypen, die man verwendet, um den Weg zur richtigen Klasse zu erraten (wonach man überprüfen kann, ob die Annotation die richtige ID enthält).In diesem speziellen Fall weiß ich auch, dass
File
es sich wahrscheinlich um eine erweiterte Klasse handeltContentEntityBase
, da sie eher dem Datenbankinhalt (einer Inhaltsentität) als der Konfiguration (einer Konfigurationsentität) ähnelt. Wenn ich sehe, dass sich meine Annahmen bestätigen, weiß ich, dass ich die richtige Klasse gefunden habe.Kurz gesagt: Ihre IDE, strategische
debug()
Aussagen und einige Vermutungen sind die besten Möglichkeiten, um Drupal 8 zu entdecken.PS-Änderungsdatensätze können ebenfalls hilfreich sein. Sie befinden sich unter https://www.drupal.org/list-changes/drupal
quelle
Sie können die PHP-Funktion get_class_methods verwenden. Im folgenden Beispiel wird eine Datei hochgeladen:
Dadurch werden alle für die Objektdatei $ verfügbaren Methoden zu Ihrem $ Methoden-Array hinzugefügt, das Sie drucken und dann alle verfügbaren Methoden anzeigen können. Dies gilt für alle Objekte in PHP, nicht nur für Drupal.
quelle