จะดีบัก EntityMalformedException อย่างไร


16

ฉันมีข้อผิดพลาดร้ายแรงEntityMalformedException: ไม่มีคุณสมบัติบันเดิลในเอนทิตีของโหนดประเภท ใน entity_extract_ids () (สาย 7700 ของ. \ รวมถึง \ common.inc) เมื่อพยายามที่จะเข้าถึงผู้ใช้ / xyz

ฉันพยายามดึงข้อมูลเกี่ยวกับโหนดที่มีรูปแบบไม่ถูกต้องที่บรรทัด 7700 ซึ่งมีการสร้างข้อความแสดงข้อผิดพลาดคิดว่า:

if (!isset($entity->{$info['entity keys']['bundle']}) || $entity->{$info['entity keys']['bundle']} === '') {
 dpm($info);// or dpm($entity);
 throw new EntityMalformedException(t('Missing bundle property on entity of type @entity_type.', array('@entity_type' => $entity_type)));
}

dpm($entity) ส่งคืนวัตถุผู้ใช้ที่ไม่คาดคิดและ $ info เป็นจำนวนมาก

มีใครบางคนทำให้ฉันในทางที่ถูก?

ฉันได้อ่านอะไรก็ตามที่ฉันสามารถหาได้เกี่ยวกับข้อผิดพลาดของคุณสมบัติบันเดิลที่หายไปแต่ไม่มีใครช่วยแก้ไข

dpm($entity) ผลตอบแทน

uid (String, 2 characters ) 70
name (String, 9 characters ) John
pass (String, 55 characters ) $S$DUwPuOuDPiDL4nRTYXqc7a5uOfMKey7pyhOFUEKka1XM...
mail (String, 30 characters ) john@example.com
theme (String, 0 characters )
signature (String, 0 characters )
signature_format (String, 13 characters ) filtered_html
created (String, 10 characters ) 1396286331
access (String, 10 characters ) 1397146661
login (String, 10 characters ) 1396513460
status (String, 1 characters ) 1
timezone (NULL)
language (String, 2 characters ) fr
picture (NULL)
init (String, 30 characters ) john@example.com
data (Array, 5 elements)
roles (Array, 1 element)
og_user_node (Array, 0 elements)
message_subscribe_email (Array, 1 element)
field_bio (Array, 0 elements)
field_name_first (Array, 1 element)
field_name_last (Array, 1 element)
field_facebook_url (Array, 0 elements)
field_linkedin_url (Array, 0 elements)
field_twitter_url (Array, 0 elements)
user_trusted_contacts (Array, 1 element)
group_group (Array, 1 element)
group_access (Array, 1 element)
metatags (Array, 0 elements)
rdf_mapping (Array, 3 elements)
realname (String, 13 characters ) John Doe
content (Array, 13 elements)
entity_view_prepared (Boolean) TRUE
privatemsg_disabled (Boolean) FALSE

นี่เป็นระดับที่ค่อนข้างต่ำซึ่งคุณสามารถค้นหาได้โดย dpm () โดยใช้ $ entity ตรวจสอบให้แน่ใจว่าคุณกำลังส่งเอนทิตีเอง - และไม่ใช่ชุดเอนทิตีที่ฟังก์ชันโหลดเอนทิตีกลับมา
AyeshK

1
ฉันหมายถึงมันเป็นพื้นตรวจสอบว่ามีข้อมูลกลุ่มที่มีอยู่ก่อนที่จะโยนข้อยกเว้น หากคุณสามารถโพสต์ผลลัพธ์ของ dpm ($ entity) (ด้วยข้อมูลที่ละเอียดอ่อนเบลอแน่นอน) นั่นจะช่วยให้ผู้อื่นเห็นว่ามีอะไรผิดปกติ
AyeshK

3
@Kojo สาเหตุแท้จริงแล้วเป็นสาเหตุง่ายๆ ... มีบางสิ่งที่เรียกentity_extract_ids('node', $var);แต่แทนที่จะเป็นโหนดวัตถุ$varมันกำลังส่งผ่านวัตถุผู้ใช้ หากคุณมีโมดูล contrib รุ่นกำหนดเองหรือ dev ลองปิดการใช้งานพวกเขาหนึ่งโดยหนึ่งเพื่อดูว่าคุณสามารถหาผู้กระทำผิด
Clive

2
Yikes dpm(debug_print_backtrace());จะล้ำค่าที่นี่ คุณสามารถดูว่าโมดูลเริ่มต้นมันทั้งหมดได้อย่างไรโดยทำตามฟังก์ชั่นกลับไปที่จุดเริ่มต้นของคำขอ
ไคลฟ์

1
ไม่ต้องกังวลหากคุณสามารถติดตั้ง xdebug และกำหนดค่าด้วยxdebug.collect_params = 4สิ่งเหล่านี้จะทำให้ชีวิตของคุณง่ายขึ้นมาก
Clive

คำตอบ:


30

ข้อผิดพลาด:

EntityMalformedException: ไม่มีคุณสมบัติบันเดิลในเอนทิตีของโหนดชนิด

เกิดขึ้นเนื่องจากคุณสมบัติบันเดิลของคุณมีรูปแบบไม่ถูกต้องทั้งในโหลดหรือบันทึกดังนั้น Drupal จึงไม่สามารถค้นหาประเภทของบันเดิลได้

ตรรกะของข้อยกเว้นนั้นคือ:

// Explicitly fail for malformed entities missing the bundle property.
if (!isset($entity->{$info['entity keys']['bundle']}) || $entity->{$info['entity keys']['bundle']} === '') {
  // var_dump(debug_backtrace()); exit; // You may want this line to debug.
  throw new EntityMalformedException(t('Missing bundle property on entity of type @entity_type.', array('@entity_type' => $entity_type)));
}

ดังนั้นโดยทั่วไปมูลค่าของ$info['entity keys']['bundle'](สำหรับโหนดคือ:) typeไม่สามารถพบได้ใน$entityวัตถุ ( $node->typeสำหรับโหนด) ดังนั้น Drupal จึงไม่ทราบว่ามันเกี่ยวข้องกับประเภทใด ดังนั้นเป็นไปได้มากว่าเอนทิตีของคุณไม่ถูกต้อง (เช่นคุณกำลังโหลดอย่างอื่นแทน) หรือว่างเปล่า ( $entityเป็นNULL)


หากคุณไม่ได้แก้ไขโค้ด Drupal ใด ๆ อาจเกิดจากความหลากหลายของสิ่งต่าง ๆ (ส่วนใหญ่เกิดจากข้อผิดพลาดโมดูล Drupal ที่เฉพาะเจาะจง) เช่น:

นี่คือรหัสที่รับผิดชอบซึ่งถูกโยนโดย Drupal core (ไฟล์:) common.inc:

 if (!empty($info['entity keys']['bundle'])) {
    // Explicitly fail for malformed entities missing the bundle property.
    if (!isset($entity->{$info['entity keys']['bundle']}) || $entity->{$info['entity keys']['bundle']} === '') {
      throw new EntityMalformedException(t('Missing bundle property on entity of type @entity_type.', array('@entity_type' => $entity_type)));
    }
    $bundle = $entity->{$info['entity keys']['bundle']};
  }

แก้จุดบกพร่อง

ถ้าคุณไม่รู้จักสิ่งที่เหนือสิ่งที่ง่ายที่สุดในการแก้ปัญหาว่าจะมีข้อผิดพลาดโดยการวางvar_dump(debug_backtrace());หรือdd(debug_backtrace());(เมื่อ Devel อยู่บน) ก่อนที่จะเกิดขึ้นจริงในบรรทัดที่ได้รับผลกระทบในthrow new EntityMalformedExceptioncommon.inc

หมายเหตุ: การใช้dd()ฟังก์ชั่นจาก Devel จะสร้างข้อมูลการดีบักไปยังไฟล์ในโฟลเดอร์ Drupal tempของคุณ( temporary://drupal_debug.txt) ด้วยการถ่ายโอนข้อมูลย้อนหลังมิฉะนั้นอาจมีขนาดใหญ่เกินไปและยากที่จะอ่านเมื่อทิ้งไว้บนหน้าจอ เมื่อใช้var_dump()งานจะง่ายต่อการโทรdie();หลังการโทรและตรวจสอบการถ่ายโอนข้อมูลในโหมดดูแหล่งที่มาของหน้า

หากสิ่งนี้เกิดขึ้นในการบันทึกโหนดให้ตรวจสอบโพสต์ EntityMalformedException ที่ SOเพื่อดูคำแนะนำโดยละเอียดเพิ่มเติม


ดูเพิ่มเติมที่ปัญหา Drupal ต่อไปนี้: # 1778572สำหรับแนวคิดเพิ่มเติม


2
รุ่งโรจน์สำหรับคำตอบรายละเอียดเช่น! ฉันแก้ไขปัญหาของฉันเมื่อนานมาแล้ว แต่ไม่ต้องสงสัยเลยว่าสิ่งนี้จะเป็นประโยชน์สำหรับผู้คนจำนวนมากฉันรวมอยู่ด้วย
Kojo

3
นี่คือคำตอบที่ยอดเยี่ยม! สมควรได้รับการโหวตมากขึ้น
คริสเตียน

ฉันเพิ่มdd(debug_backtrace());ไปยังบรรทัดที่ได้รับผลกระทบด้านหน้าthrow new EntityMalformedExceptionทำให้แน่ใจว่า Devel เปิดใช้งานและรันคำสั่ง drush ใน cron ที่กำลังโยนข้อผิดพลาดนี้และฉันไม่ได้รับเอาต์พุตการดีบักใด ๆ ฉันทำอะไรผิด? ขอบคุณ!
Christia

1
พบมัน: คำสั่งสร้างไฟล์ชื่อdrupal_debug.txtข้างใน/tmp/drupal_theme/โดยที่ "drupal_theme" เป็นชื่อของธีม drupal ขอบคุณสำหรับความช่วยเหลือในการดีบั๊กของคุณ!
Christia

8

ขอบคุณความคิดเห็นไคลฟ์ฉันแก้ไขปัญหาดังต่อไปนี้

เพิ่มddebug_backtrace()ตำแหน่งที่เกิดข้อผิดพลาด ( เอนทิตี _extract_ids (), บรรทัด 7700 ของ. \ include \ common.inc ) เพื่อพิมพ์สแตกการเรียกฟังก์ชัน

จากนั้นมองหาสิ่งที่ไม่คาดคิดในผลลัพธ์ฉันพบว่ากฎการมองเห็นของบานหน้าต่างอาจเป็นปัญหา

19: ctools_entity_field_value_ctools_access_check() (Array, 2 elements)
  file (String, 81 characters ) profiles\commons\modules\contrib\ctools\plugins...
  $...['19: ctools_entity_field_value_ctools_access_check()']['file']
    profiles\commons\modules\contrib\ctools\plugins\access\entity_field_value.inc:213
  args (Array, 3 elements)
    0 (Array, 2 elements)
      field_theme (Array, 1 element)
      //...

ฉันใช้ชุดข้อมูลแก้ไขเมื่อentity_field_value.incไม่กี่วันที่ผ่านมาเพื่อแก้ไขกฎการแจ้งเตือนการมองเห็น ... และสร้างกฎการเปิดเผยการทดสอบโดยมีเงื่อนไข field_theme

ตอนนี้กำลังคืนแพทช์หรือลบกฎการมองเห็นบานหน้าต่างใด ๆ แก้ไขข้อผิดพลาด EntityMalformedException ปัจจุบัน ... มีประสิทธิภาพddebug_backtrace()!


ฉันลองใช้วิธีนี้และฉันได้รับ 1,000 บรรทัดของรหัสในส่วนหน้า คุณเห็นว่าข้อผิดพลาดอยู่ที่ไหน
Sam

@Sam ดูที่คำตอบของ Kenorb มันอาจช่วยคุณได้
Kojo

0

ปัญหานี้เกิดขึ้นเมื่อมีโหนดกำพร้าเพียงกำจัดพวกเขาและ cron จะทำงานโดยไม่มีข้อผิดพลาด การจัดทำดัชนีการค้นหาจะได้รับ 100% ในที่สุด สำรองฐานข้อมูลของคุณก่อนดำเนินการต่อ

สมมติว่าคุณมีสิทธิ์เข้าถึง phpMyAdmin ให้รันโค้ด SQL นี้เพื่อระบุโหนดจากนั้นลบทิ้ง แทนที่ชื่อเครื่องประเภทเนื้อหาคำถามของฉันด้วยชื่อเครื่องประเภทเนื้อหาเฉพาะของคุณหนึ่งหลังจากที่อื่น ๆ จนกว่าคุณจะไม่ได้รับผลลัพธ์นั่นคือหลังจากลบ

SELECT n.nid, n.title, n.vid, nr.vid FROM drcm_node n LEFT JOIN drcm_node_revision nr ON nr.nid = n.nid WHERE n.type = 'question' AND nr.vid IS NULL ORDER BY n.nid ASC

คุณสามารถลบโหนดที่ไม่ได้ใช้งานโดยใช้รหัส SQL ด้านล่าง แทนที่ตัวเลขในวงเล็บด้วย ID โหนดเฉพาะของคุณ

DELETE from node where nid IN (12779,12780,12781,12782)

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