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()?


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 .


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.


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.


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.


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.



Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.