Gibt es eine gute Möglichkeit, Objekte zu untersuchen, deren Typ von der EntityDrupalWrapper-Klasse abgeleitet ist?

38

Ich bin mir sicher, dass diese Frage auf andere komplexe Objekttypen zutrifft, aber EntityDrupalWrapperich arbeite gerade damit. Dies ist der Objekttyp, den entity_metadata_wrapper()(und wahrscheinlich auch andere) zurückgeben.

Wenn Sie Code wie den folgenden verwenden:

$order_wrapper = entity_metadata_wrapper('commerce_order', $order_object);
dpm($order_wrapper);

Die Ausgabe von Devel ist nicht allzu hilfreich:

Bildschirmfoto

Es wird nicht angezeigt, was Sie erwarten, wenn Sie dpm()beispielsweise ein stdClassObjekt aufrufen .

Ein ähnlicher Aufruf von dvm()gibt das Objekt aus, ist aber in einer Weise, die ich nicht kenne, und nicht sehr lesbar.

Ich habe es versucht debug()und es erzeugt einen PHP-Benutzerhinweis, der ungefähr so ​​aussieht:

Screenshot 2

Übrigens ist die in dieser Warnung enthaltene HTML-Ausgabe dieselbe Ausgabe, die dvm()auf dem Bildschirm ausgegeben wird .

Wie kann ich diese Art von Objekten (vorzugsweise mit Krumo) untersuchen, um festzustellen, welche Eigenschaften verfügbar sind? Oder stecke ich fest mit dvm()?

Clive
quelle
versuchen Sie debug (), das in Drupal 7
Shoaib Nawaz am
Danke @ShuaibNawaz, noch weniger Erfolg damit, obwohl ich Angst habe (ich habe die Frage aktualisiert)
Clive
2
Ja, das ist genau eines der Probleme mit den Wrapper-Klassen. dpm () / krumo sieht nur öffentliche Eigenschaften. Alles in den Wrapper-Klassen ist geschützt und der Zugriff erfolgt über die Methoden magic __get () und __set ().
Berdir
@Berdir Ich hatte Angst davor; Ich hatte nicht ausgesehen, aber es roch sehr __get()und __set()war involviert. Haben Sie aus Interesse eine bevorzugte Möglichkeit, herauszufinden, welche Klasseneigenschaften für welchen Wrapper verfügbar sind? Oder geht es nur darum, aus Erfahrung zu wissen?
Clive
1
@Berdir Ich glaube nicht, dass du darüber benachrichtigt wirst, du kannst es benutzen dpm($wrapper->getPropertyInfo());, es hilft wirklich
Clive

Antworten:

38

Verwenden Sie dpm ($ wrapper-> getPropertyInfo ());

Es ist in den Dokumenten .

TwiiK
quelle
Und um bestimmte Felder von Ihrem Knoten aus zu untersuchen, können Siekpr($wrapper->my_custom_field->value());
wranvaud
4

Ich hatte mit EntityDrupalWrapper-Objekten gespielt. debug () gibt normalerweise die Ausgabe zurück, die möglicherweise von __toString () vorbereitet wurde.

Ich habe das EntityDrupalWrapper-Objekt mit foreach iteriert und dabei geholfen, den Namen der Eigenschaften aufzulisten.

foreach($order_wrapper as $name => $obj){
  debug($name);
  debug(get_class($obj)); //EntityValueWrapper
}

Hier $objist ein Objekt vom TypEntityValueWrapper

$ obj kann von $ obj-> value () gelesen und von $ obj-> set ('value') geschrieben werden;

BEARBEITEN:

Wenn Sie Ihren Wrapper ohne Übergabe eines zweiten Parameters erstellt haben, z.
B. entity_metadata_wrapper ('commerce_order');
Dann lösen set- und value-Methoden eine Ausnahme aus, da sie nicht implementiert sind.

Shoaib Nawaz
quelle
4

Ich habe mein eigenes kleines Widget geschrieben, um den Wrapper abzurollen:

function _wrapper_debug($w) {
  $values = array();
  foreach ($w->getPropertyInfo() as $key => $val) {
    $values[$key] = $w->$key->value();
  }
  return $values;
}

dpm(_wrapper_debug($some_object_wrapper));

Hoffe, jemand findet es nützlich.

Gürteltier Jim
quelle
3

Das Inspect- Modul bietet eine schöne strukturelle Ansicht der Daten, die Sie debuggen möchten.

Erhalten Sie lehrreiche und gut formatierte Variablen-Dumps, Deep-Stack-Traces und Ausführungszeitprofile - zum Datenbankprotokoll (Berichte / Letzte Protokollnachrichten), zum Ablegen oder zum Anzeigen.

Lars Nielsen
quelle
3

Wenn Sie das ursprüngliche Objekt untersuchen möchten, das den Wrapper "antreibt", versuchen Sie Folgendes:

dpm($wrapper->raw())

Das funktioniert gut für mich.

Nick
quelle
0

Verwenden Sie das Drupal-CLI

$ drupal debug:entity
// Displays current events 
Kevin Howbrook
quelle