¿Hay una buena manera de inspeccionar objetos cuyo tipo se deriva de la clase EntityDrupalWrapper?

38

Estoy seguro de que esta pregunta se aplica a otros tipos de objetos complejos, pero EntityDrupalWrapperes con la que estoy trabajando actualmente. Este es el tipo de objeto devuelto por entity_metadata_wrapper()(y probablemente otros).

Cuando se usa un código como el siguiente:

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

la salida de Devel no es muy útil:

captura de pantalla

No muestra lo que esperaría ver para una llamada dpm()con, por ejemplo, un stdClassobjeto.

Una llamada similar a dvm()imprime el objeto, pero de una manera con la que no estoy familiarizado, y no es muy legible.

Lo he intentado debug()y produce un aviso de usuario de PHP que se parece a esto:

captura de pantalla 2

Por cierto, la salida HTML contenida en esa advertencia es la misma salida que se dvm()imprime en la pantalla.

¿Cómo puedo inspeccionar este tipo de objetos (preferiblemente con Krumo), para ver qué propiedades están disponibles? ¿O estoy atrapado usando dvm()?

Clive
fuente
try debug () introducido en Drupal 7
Shoaib Nawaz
Gracias @ShuaibNawaz, incluso menos éxito con eso, aunque me temo (he actualizado la pregunta)
Clive
2
Sí, ese es exactamente uno de los problemas con las clases de envoltura. dpm () / krumo solo ve propiedades públicas. Todo en las clases de envoltura está protegido y se accede a través de los métodos mágicos __get () y __set ().
Berdir
@ Berdir Tenía miedo de eso; No había mirado pero olía mucho __get()y __set()estaba involucrado. Por interés, ¿tiene alguna forma preferida de averiguar qué propiedades de clase están disponibles para qué envoltorio? ¿O es solo una cuestión de "saber" basado en la experiencia?
Clive
1
@ Berdir No creo que te notifiquen de esto, puedes usarlo dpm($wrapper->getPropertyInfo());, realmente ayuda a las cosas
Clive

Respuestas:

38

Use dpm ($ wrapper-> getPropertyInfo ());

Está en los documentos .

TwiiK
fuente
Y para inspeccionar los campos particulares de su nodo puede utilizarkpr($wrapper->my_custom_field->value());
wranvaud
4

Había estado jugando con objetos EntityDrupalWrapper. debug () generalmente devuelve el resultado que puede haber preparado por __toString ()

Repetí el objeto EntityDrupalWrapper usando foreach y me ayudó a enumerar el nombre de las propiedades.

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

Aquí $objhay un objeto de tipoEntityValueWrapper

$ obj se puede leer con $ obj-> value () y se puede escribir con $ obj-> set ('value');

EDITAR:

Si ha creado su contenedor sin pasar el segundo
parámetro, es decir, entity_metadata_wrapper ('commerce_order');
luego los métodos set y value arrojarán excepciones ya que no se implementan.

Shoaib Nawaz
fuente
4

Terminé escribiendo mi propio pequeño widget para desenrollar el contenedor:

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

Espero que alguien lo encuentre útil.

Armadillo Jim
fuente
3

El módulo Inspeccionar proporciona una buena vista estructural de los datos que desea depurar.

Obtenga volcados de variables instructivos y bien formateados, trazas de pila profunda y perfiles de tiempo de ejecución: en el registro de la base de datos (Informes / Mensajes de registro recientes), en el archivo o en la pantalla.

Lars Nielsen
fuente
3

Si desea inspeccionar el objeto original que "alimenta" el contenedor, intente:

dpm($wrapper->raw())

Esto funciona bien para mi.

Mella
fuente
0

Usa el drupal cli

$ drupal debug:entity
// Displays current events 
Kevin howbrook
fuente