Existe uma boa maneira de inspecionar objetos cujo tipo é derivado da classe EntityDrupalWrapper?

38

Tenho certeza de que essa pergunta se aplica a outros tipos de objetos complexos, mas EntityDrupalWrapperé com quem estou trabalhando atualmente. Este é o tipo de objeto retornado por entity_metadata_wrapper()(e provavelmente outros).

Ao usar código como o seguinte:

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

a saída do Devel não é muito útil:

captura de tela

Não mostra o que você esperaria ver em uma chamada para dpm(), por exemplo, um stdClassobjeto.

Uma chamada semelhante ao dvm()imprime o objeto, mas de uma maneira que eu não estou familiarizado e não é muito legível.

Eu tentei debug()e produz um aviso de usuário PHP que se parece com isso:

captura de tela 2

Aliás, a saída HTML contida nesse aviso é a mesma saída dvm()impressa na tela.

Como posso inspecionar esses tipos de objetos (de preferência com o Krumo), para ver quais propriedades estão disponíveis? Ou estou preso usando dvm()?

Clive
fonte
tente debug () introduzido no Drupal 7
Shoaib Nawaz
Graças @ShuaibNawaz, ainda menos sucesso com aquele que eu tenho medo (Eu atualizei a questão)
Clive
2
Sim, esse é exatamente um dos problemas com as classes de wrapper. O dpm () / krumo vê apenas propriedades públicas. Tudo nas classes de wrapper é protegido e acessado pelos métodos magic __get () e __set ().
22812 Berdir
@Berdir Eu tinha medo disso; Eu não tinha olhado, mas cheirava muito __get()e __set()estava envolvido. Por interesse, você tem alguma maneira preferida de descobrir quais propriedades de classe estão disponíveis para qual wrapper? Ou é apenas uma questão de 'conhecimento' baseado na experiência?
Clive
1
@Berdir Eu não acho que você vai ser notificado disto, você pode usar dpm($wrapper->getPropertyInfo());, ele realmente ajuda as coisas
Clive

Respostas:

38

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

Está nos documentos .

TwiiK
fonte
E para inspecionar campos específicos do seu nó, você pode usarkpr($wrapper->my_custom_field->value());
wranvaud
4

Eu estava brincando com objetos EntityDrupalWrapper. debug () geralmente retorna a saída que pode ter sido preparada por __toString ()

Eu iterava o objeto EntityDrupalWrapper usando o foreach e ajudou a listar o nome das propriedades.

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

Aqui $objestá um objeto do tipoEntityValueWrapper

$ obj pode ser lido por $ obj-> value () e pode ser escrito por $ obj-> set ('value');

EDITAR:

Se você criou seu wrapper sem passar o segundo parâmetro, por exemplo,
entity_metadata_wrapper ('commerce_order');
os métodos set e value gerarão uma exceção, pois não são implementados.

Shoaib Nawaz
fonte
4

Acabei escrevendo meu próprio widget para desenrolar o invólucro:

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 alguém ache útil.

Armadillo Jim
fonte
3

O módulo Inspecionar fornece uma boa visão estrutural dos dados que você deseja depurar.

Obtenha despejos variáveis ​​instrutivos e bem formatados, rastreios de pilha profunda e perfis de tempo de execução - para o log do banco de dados (Relatórios / Mensagens de log recentes), para arquivar ou rastrear.

Lars Nielsen
fonte
3

Se você deseja inspecionar o objeto original que está "alimentando" o wrapper, tente:

dpm($wrapper->raw())

Isto funciona bem para mim.

usuario
fonte
0

Use o drupal cli

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