Apakah ada cara yang baik untuk memeriksa objek yang tipenya berasal dari kelas EntityDrupalWrapper?

38

Saya yakin pertanyaan ini berlaku untuk jenis objek kompleks lainnya, tetapi EntityDrupalWrapperapakah yang saat ini saya kerjakan. Ini adalah jenis objek yang dikembalikan oleh entity_metadata_wrapper()(dan mungkin yang lain).

Saat menggunakan kode seperti berikut:

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

output dari Devel tidak terlalu membantu:

tangkapan layar

Itu tidak menunjukkan apa yang Anda harapkan untuk panggilan dpm()dengan, misalnya, stdClassobjek.

Panggilan serupa untuk dvm()mencetak objek, tetapi dengan cara yang saya tidak kenal, dan itu tidak terlalu mudah dibaca.

Saya sudah mencoba debug()dan menghasilkan pemberitahuan pengguna PHP yang terlihat seperti ini:

tangkapan layar 2

Secara tidak sengaja keluaran HTML yang terkandung dalam peringatan itu adalah keluaran yang sama yang dvm()dicetak ke layar.

Bagaimana saya bisa memeriksa objek jenis ini (lebih disukai dengan Krumo), jadi saya bisa melihat properti apa yang tersedia? Atau saya terjebak menggunakan dvm()?

Clive
sumber
coba debug () yang diperkenalkan di Drupal 7
Shoaib Nawaz
Terima kasih @ShuaibNawaz, bahkan kurang berhasil dengan yang satu itu meskipun saya takut (saya telah memperbarui pertanyaan)
Clive
2
Yap, itu persis salah satu masalah dengan kelas pembungkus. dpm () / krumo hanya melihat properti publik. Semua yang ada di kelas wrapper dilindungi dan diakses melalui metode sulap __get () dan __set ().
Berdir
@Berdir Saya takut itu; Saya belum melihat tetapi baunya sangat mirip __get()dan __set()terlibat. Karena minat, apakah Anda memiliki cara yang disukai untuk mencari tahu properti kelas apa yang tersedia untuk pembungkus apa? Atau itu hanya masalah 'mengetahui' berdasarkan pengalaman?
Clive
1
@Berdir Saya tidak berpikir Anda akan diberitahu tentang ini, Anda dapat menggunakan dpm($wrapper->getPropertyInfo());, itu benar-benar membantu hal
Clive

Jawaban:

38

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

Ada dalam dokumen .

TwiiK
sumber
Dan untuk memeriksa bidang tertentu dari simpul Anda, Anda dapat menggunakankpr($wrapper->my_custom_field->value());
wranvaud
4

Saya telah bermain dengan benda-benda EntityDrupalWrapper. debug () biasanya mengembalikan output yang mungkin telah disiapkan oleh __toString ()

Saya mengulangi objek EntityDrupalWrapper menggunakan foreach dan membantu untuk membuat daftar nama properti.

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

Ini $objadalah objek bertipeEntityValueWrapper

$ obj dapat dibaca oleh $ obj-> value () dan dapat ditulis oleh $ obj-> set ('value');

EDIT:

Jika Anda telah membuat pembungkus Anda tanpa melewati param kedua
yaitu entity_metadata_wrapper ('commerce_order');
kemudian atur dan nilai metode akan membuang pengecualian karena tidak diterapkan.

Shoaib Nawaz
sumber
4

Saya akhirnya menulis widget kecil saya sendiri untuk membuka gulungan bungkusnya:

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

Semoga seseorang menemukan itu berguna.

Armadillo Jim
sumber
3

The Periksa modul memberikan pandangan struktural bagus dari data yang ingin Anda debug.

Dapatkan dump variabel yang instruktif dan diformat dengan baik, jejak stack yang dalam, dan profil waktu eksekusi - ke log basis data (Laporan / Pesan log terbaru), ke file atau ke layar.

Lars Nielsen
sumber
3

Jika Anda ingin memeriksa objek asli yang "menyalakan" pembungkus, coba:

dpm($wrapper->raw())

Ini bekerja dengan baik untuk saya.

Nick
sumber
2

Ada tambalan devel yang memungkinkan Krumo untuk menunjukkan semua properti pribadi dan yang dilindungi.

Ini adalah utas di drupal.org

Saya menemukan patch ini sangat membantu.

Felix Eve
sumber
0

Gunakan cli drupal

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