มีวิธีที่ดีในการตรวจสอบวัตถุที่ได้รับมาจากคลาส EntityDrupalWrapper หรือไม่?


38

ฉันแน่ใจว่าคำถามนี้ใช้กับประเภทวัตถุที่ซับซ้อนอื่น ๆ แต่EntityDrupalWrapperเป็นคำถามที่ฉันใช้งานอยู่ นี่คือประเภทของวัตถุที่ส่งคืนโดยentity_metadata_wrapper()(และอาจเป็นอย่างอื่น)

เมื่อใช้รหัสดังต่อไปนี้:

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

ผลลัพธ์จาก Devel ไม่มีประโยชน์มากเกินไป:

ภาพหน้าจอ

ไม่แสดงสิ่งที่คุณคาดว่าจะเห็นเมื่อมีสายเรียกเข้าdpm()เช่นstdClassวัตถุ

การเรียกที่คล้ายกันเพื่อdvm()พิมพ์วัตถุ แต่ในลักษณะที่ฉันไม่คุ้นเคยและมันไม่สามารถอ่านได้มาก

ฉันลองdebug()แล้วมันจะสร้างการแจ้งเตือนผู้ใช้ PHP ที่มีลักษณะดังนี้:

สกรีนช็อต 2

อนึ่งเอาต์พุต HTML ที่มีอยู่ในคำเตือนนั้นเป็นเอาต์พุตเดียวกันกับที่dvm()พิมพ์ไปที่หน้าจอ

ฉันจะตรวจสอบวัตถุประเภทนี้ (ควรใช้กับ Krumo) ได้อย่างไรเพื่อที่ฉันจะเห็นว่ามีคุณสมบัติใดบ้าง หรือฉันติดอยู่กับการใช้dvm()?


ลองดีบั๊ก () เปิดตัวใน Drupal 7
Shoaib Nawaz

ขอบคุณ @ShuaibNawaz แม้จะประสบความสำเร็จน้อยลงแม้ว่าฉันกลัว (ฉันได้อัปเดตคำถาม)
Clive

2
ใช่นั่นเป็นหนึ่งในปัญหาของคลาส wrapper dpm () / krumo เห็นคุณสมบัติสาธารณะเท่านั้น ทุกอย่างในคลาส wrapper ได้รับการปกป้องและการเข้าถึงด้วยวิธีการ __get () และ __set ()
Berdir

@Berdir ฉันกลัวว่า; ฉันไม่ได้ดู แต่มันได้กลิ่นมาก__get()และ__set()มีส่วนร่วม คุณสนใจวิธีใดในการค้นหาว่าคุณสมบัติคลาสใดที่พร้อมใช้สำหรับ wrapper ใด? หรือมันเป็นเพียงเรื่องของการ 'รู้' จากประสบการณ์?
Clive

1
@Berdir ฉันไม่คิดว่าคุณจะได้รับแจ้งเรื่องนี้คุณสามารถใช้dpm($wrapper->getPropertyInfo());มันช่วยได้จริงๆ
Clive

คำตอบ:


38

ใช้ dpm ($ wrapper-> getPropertyInfo ());

มันอยู่ในเอกสาร


และเพื่อตรวจสอบฟิลด์เฉพาะจากโหนดของคุณคุณสามารถใช้kpr($wrapper->my_custom_field->value());
wranvaud

4

ฉันเล่นกับวัตถุ EntityDrupalWrapper debug () มักจะส่งคืนผลลัพธ์ที่อาจเตรียมไว้โดย __toString ()

ฉันทำซ้ำวัตถุ EntityDrupalWrapper โดยใช้ foreach และช่วยแสดงรายการชื่อคุณสมบัติ

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

นี่$objคือวัตถุประเภทEntityValueWrapper

$ obj สามารถอ่านได้โดย $ obj-> value () และสามารถเขียนได้โดย $ obj-> set ('value');

แก้ไข:

หากคุณสร้าง wrapper ของคุณโดยไม่ผ่านพารามิเตอร์ที่สอง
เช่น entity_metadata_wrapper ('commerce_order');
จากนั้นวิธีการตั้งค่าและค่าจะทำให้เกิดข้อยกเว้นเนื่องจากไม่มีการใช้งาน


4

ฉันกระทบกระเทือนการเขียนวิดเจ็ตตัวเล็ก ๆ ของฉันเองเพื่อคลายกระดาษห่อหุ้ม:

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

หวังว่าใครบางคนพบว่ามันมีประโยชน์


3

ตรวจสอบโมดูลให้มุมมองที่มีโครงสร้างที่ดีของข้อมูลที่คุณต้องการที่จะแก้ปัญหา

รับดัมพ์ตัวแปรที่ให้คำแนะนำและจัดรูปแบบที่ดีการติดตามสแต็คลึกและโปรไฟล์เวลาดำเนินการ - ไปยังบันทึกฐานข้อมูล (รายงาน / ข้อความบันทึกล่าสุด) ไปยังไฟล์หรือไปที่หน้าจอ


3

หากคุณต้องการตรวจสอบวัตถุต้นฉบับที่เป็น "powering" wrapper ลอง:

dpm($wrapper->raw())

มันใช้งานได้ดีสำหรับฉัน



โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.