Existe-t-il un bon moyen d'inspecter les objets dont le type est dérivé de la classe EntityDrupalWrapper?

38

Je suis sûr que cette question s'applique à d'autres types d'objets complexes, mais EntityDrupalWrapperc'est celui avec lequel je travaille actuellement. C'est le type d'objet retourné par entity_metadata_wrapper()(et probablement d'autres).

Lorsque vous utilisez un code comme celui-ci:

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

la sortie de Devel n'est pas très utile:

capture d'écran

Il ne montre pas ce que vous attendez de voir pour un appel dpm()avec, par exemple, un stdClassobjet.

Un appel similaire à dvm()imprimer l'objet, mais d'une manière que je ne connais pas, et ce n'est pas très lisible.

J'ai essayé debug()et cela génère une notice utilisateur PHP qui ressemble à ceci:

capture d'écran 2

Incidemment, la sortie HTML contenue dans cet avertissement est la même que celle dvm()imprimée à l'écran.

Comment puis-je inspecter ces types d'objets (de préférence avec Krumo) afin de voir quelles propriétés sont disponibles? Ou suis-je coincé en utilisant dvm()?

Clive
la source
try debug () introduit dans Drupal 7
Shoaib Nawaz
Merci @ShuaibNawaz, encore moins de succès avec celui-là même si j'ai bien peur (j'ai mis à jour la question)
Clive
2
Oui, c'est exactement l'un des problèmes des classes wrapper. dpm () / krumo ne voit que les propriétés publiques. Tout le contenu des classes wrapper est protégé et accessible via les méthodes magiques __get () et __set ().
Berdir
@Berdir J'avais peur de ça; Je n'avais pas regardé mais ça sentait beaucoup __get()et __set()étaient impliqués. Si vous êtes intéressé, avez-vous un moyen privilégié de déterminer quelles propriétés de classe sont disponibles pour quel wrapper? Ou est-ce juste une question de "savoir" basée sur l'expérience?
Clive
1
@Berdir Je ne pense pas que vous en serez averti, vous pouvez utiliser dpm($wrapper->getPropertyInfo());, cela aide vraiment les choses
Clive

Réponses:

38

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

C'est dans la documentation .

TwiiK
la source
Et pour inspecter des champs particuliers de votre nœud, vous pouvez utiliserkpr($wrapper->my_custom_field->value());
wranvaud le
4

Je jouais avec des objets EntityDrupalWrapper. debug () retourne généralement le résultat que __toString () aurait préparé

J'ai itéré l'objet EntityDrupalWrapper à l'aide de foreach et cela a aidé à répertorier le nom des propriétés.

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

Voici $objun objet de typeEntityValueWrapper

$ obj peut être lu par $ obj-> value () et peut être écrit par $ obj-> set ('value');

MODIFIER:

Si vous avez créé votre wrapper sans passer le second
paramètre, c’est-à-dire entity_metadata_wrapper ('commerce_order');
alors, les méthodes set et value lèveront une exception car elles ne sont pas implémentées.

Shoaib Nawaz
la source
4

J'ai fini par écrire mon propre petit widget pour dérouler le 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));

J'espère que quelqu'un le trouvera utile.

Tatou Jim
la source
3

Le module Inspect fournit une vue structurelle intéressante des données que vous souhaitez déboguer.

Obtenez des vidages de variables instructifs et bien formatés, des traces de pile et des profils de temps d'exécution - dans le journal de la base de données (rapports / messages récents), dans un fichier ou à l'écran.

Lars Nielsen
la source
3

Si vous souhaitez inspecter l'objet d'origine qui "alimente" le wrapper, essayez:

dpm($wrapper->raw())

Cela fonctionne bien pour moi.

Entaille
la source
0

Utilisez le Drupal Cli

$ drupal debug:entity
// Displays current events 
Kevin Howbrook
la source