Esiste un buon modo per ispezionare oggetti il ​​cui tipo è derivato dalla classe EntityDrupalWrapper?


38

Sono sicuro che questa domanda si applica ad altri tipi di oggetti complessi, ma EntityDrupalWrapperè quella con cui sto attualmente lavorando. Questo è il tipo di oggetto restituito da entity_metadata_wrapper()(e probabilmente da altri).

Quando si utilizza il codice come il seguente:

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

l'output di Devel non è troppo utile:

immagine dello schermo

Non mostra ciò che ti aspetteresti di vedere per una chiamata dpm()con, ad esempio, un stdClassoggetto.

Una chiamata simile dvm()fa stampare l'oggetto, ma in un modo che non conosco, e non è molto leggibile.

Ho provato debug()e produce un avviso utente PHP che assomiglia a questo:

screenshot 2

Per inciso, l'output HTML contenuto in quell'avvertimento è lo stesso output che viene dvm()stampato sullo schermo.

Come posso ispezionare questi tipi di oggetti (preferibilmente con Krumo), così posso vedere quali proprietà sono disponibili? O sono bloccato usando dvm()?


provare il debug () introdotto in Drupal 7
Shoaib Nawaz il

Grazie @ShuaibNawaz, ancora meno successo con quello, anche se temo (ho aggiornato la domanda)
Clive

2
Sì, questo è esattamente uno dei problemi con le classi wrapper. dpm () / krumo vede solo proprietà pubbliche. Tutto nelle classi wrapper è protetto e l'accesso tramite i metodi __get () e __set () magici.
Berdir,

@Berdir ne avevo paura; Non avevo guardato ma aveva un odore molto simile __get()ed __set()erano coinvolti. Per interesse hai qualche modo preferito di scoprire quali proprietà della classe sono disponibili per quale wrapper? O è solo una questione di "conoscenza" basata sull'esperienza?
Clive

1
@Berdir Non credo che ti verrà notificato questo, puoi usarlo dpm($wrapper->getPropertyInfo());, aiuta davvero le cose
Clive

Risposte:


38

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

È nei documenti .


E per ispezionare determinati campi dal tuo nodo puoi usarekpr($wrapper->my_custom_field->value());
wranvaud,

4

Stavo giocando con gli oggetti EntityDrupalWrapper. debug () di solito restituisce l'output che potrebbe essere stato preparato da __toString ()

Ho iterato l'oggetto EntityDrupalWrapper usando foreach e mi ha aiutato a elencare il nome delle proprietà.

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

Ecco $objun oggetto di tipoEntityValueWrapper

$ obj può essere letto da $ obj-> value () e può essere scritto da $ obj-> set ('value');

MODIFICARE:

Se hai creato il tuo wrapper senza passare il secondo parametro
ie entity_metadata_wrapper ('commerce_order');
quindi i metodi set e value genereranno eccezioni poiché non sono implementati.


4

Ho finito per scrivere il mio piccolo widget per srotolare il wrapper:

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

Spero che qualcuno lo trovi utile.


3

Il modulo Inspect offre una bella vista strutturale dei dati che si desidera eseguire il debug.

Ottieni dump variabili istruttivi e ben formattati, tracce di deep stack e profili dei tempi di esecuzione - nel registro del database (Rapporti / Messaggi di registro recenti), nel file o sullo schermo.


3

Se si desidera ispezionare l'oggetto originale che "alimenta" il wrapper, provare:

dpm($wrapper->raw())

Questo funziona bene per me.



Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.