Bagaimana cara men-debug EntityMalformedException?

16

Saya mendapatkan kesalahan fatal EntityMalformedException: Properti bundel tidak ada pada entitas tipe node. di entity_extract_ids () (baris 7700 dari. \ termasuk \ common.inc) ketika mencoba mengakses pengguna / xyz .

Saya mencoba mengambil info tentang simpul cacat pada baris 7700, tempat pesan kesalahan dibuat, berpikir seperti:

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) mengembalikan objek pengguna yang tidak terduga, dan $ info sejumlah besar hal.

Bisakah seseorang menempatkan saya di jalan yang benar?

Saya sudah membaca apa pun yang bisa saya temukan tentang kesalahan properti bundel yang Hilang , tetapi tidak ada yang membantu menyelesaikan.

dpm($entity) kembali

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
Kojo
sumber
Ini biasanya level yang cukup rendah yang bisa Anda ketahui hanya dengan dpm () pada entitas $. Pastikan Anda melewati entitas itu sendiri - dan bukan satu set entitas yang mengembalikan fungsi entitas.
AyeshK
1
Maksud saya itu pada dasarnya memeriksa apakah informasi bundel ada sebelum melempar pengecualian. Jika Anda dapat memposting output dpm ($ entitas) (dengan informasi sensitif kabur tentu saja), itu akan membantu orang lain untuk melihat apa yang salah.
AyeshK
3
@ Yojo Penyebabnya sebenarnya sangat sederhana ... ada sesuatu yang memanggil entity_extract_ids('node', $var);, tapi bukannya objek simpul $var, itu melewati objek pengguna. Jika Anda memiliki modul kontribus versi kustom atau dev, coba nonaktifkan satu per satu untuk melihatnya Anda dapat menemukan pelakunya
Clive
2
Astaga. dpm(debug_print_backtrace());akan sangat berharga di sini. Anda dapat melihat modul apa yang memulai semuanya dengan mengikuti fungsi-fungsi kembali ke awal permintaan
Clive
1
Jangan khawatir, jika Anda bisa menginstal dan mengkonfigurasi xdebug dengan xdebug.collect_params = 4itu juga akan membuat hidup Anda jauh lebih mudah
Clive

Jawaban:

29

Kesalahan:

EntityMalformedException: Properti bundel tidak ada pada entitas tipe node.

terjadi, karena properti bundel Anda salah format saat dimuat atau disimpan, jadi Drupal tidak dapat menemukan jenis bundel apa itu.

Logika Pengecualian itu adalah:

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

Jadi pada dasarnya nilai $info['entity keys']['bundle'](untuk simpul:) typetidak dapat ditemukan dalam $entityobjek ( $node->typeuntuk simpul), oleh karena itu Drupal tidak tahu dengan jenis entitas yang dihadapinya. Jadi kemungkinan besar entitas Anda tidak valid (misalnya Anda sedang memuat sesuatu yang lain sebagai gantinya) atau itu hanya kosong ( $entityadalah NULL).


Jika Anda belum mengubah kode Drupal apa pun, ini berpotensi dapat disebabkan oleh berbagai hal (kemungkinan besar oleh bug modul Drupal tertentu), seperti:

Berikut adalah kode yang bertanggung jawab yang dilemparkan oleh Drupal core (file:) 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']};
  }

Debugging

Jika Anda tidak mengenali apa pun di atas, hal yang paling mudah untuk men-debug kesalahan semacam itu adalah dengan menempatkan var_dump(debug_backtrace());atau dd(debug_backtrace());(ketika Devel aktif) sebelum aktual throw new EntityMalformedExceptionpada baris yang terpengaruh common.inc.

Catatan: Menggunakan dd()fungsi dari Devel akan menghasilkan info debug ke file di folder temp Drupal Anda ( temporary://drupal_debug.txt) dengan dump backtrace, jika tidak bisa terlalu besar dan sulit dibaca ketika membuang di layar. Saat menggunakan var_dump(), lebih mudah untuk memanggil die();setelah panggilan dan memeriksa dump dalam mode view-source halaman.

Jika ini terjadi pada penyimpanan simpul, periksa posting EntityMalformedException ini di SO untuk instruksi lebih detail.


Lihat juga masalah Drupal berikut: # 1778572 untuk lebih banyak ide.

kenorb
sumber
2
pujian untuk jawaban terinci seperti itu! Saya telah memecahkan masalah saya sejak lama, tetapi tidak diragukan lagi ini akan bermanfaat bagi banyak orang, termasuk saya.
Kojo
3
Ini jawaban yang fantastis! Pantas lebih banyak upvotes.
Christian
Saya menambahkan dd(debug_backtrace());ke baris yang terpengaruh di depan throw new EntityMalformedException, memastikan Devel diaktifkan dan menjalankan perintah drush di cron yang melempar kesalahan ini dan saya tidak mendapatkan hasil debugging. Apa kesalahan yang telah aku perbuat? Terima kasih!
Christia
1
Ditemukan: perintah membuat file bernama drupal_debug.txtinside di /tmp/drupal_theme/mana "drupal_theme" adalah nama tema drupal. Terima kasih atas bantuan debug Anda yang luar biasa!
Christia
8

Berkat komentar Clive, saya memecahkan masalah sebagai berikut.

Menambahkan ddebug_backtrace()tempat terjadinya kesalahan ( entity_extract_ids (), baris 7700 dari. \ Termasuk \ common.inc ) untuk mencetak tumpukan panggilan fungsi.

Kemudian mencari sesuatu yang tidak terduga dalam output, saya menemukan bahwa aturan visibilitas panel mungkin menjadi masalah.

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)
      //...

Saya telah menerapkan tambalan pada entity_field_value.incbeberapa hari yang lalu hanya untuk menyelesaikan pemberitahuan aturan visibilitas ... dan membuat aturan uji visibilitas dengan kondisi field_theme.

Sekarang mengembalikan tambalan atau menghapus aturan visibilitas panel apa pun yang memecahkan bug EntityMalformedException saat ini ... Kuat ddebug_backtrace()!

Kojo
sumber
Saya mencoba metode ini dan saya mendapatkan 1000-an baris kode di ujung depan. Bagaimana Anda melihat di mana kesalahannya?
Sam
@ Sam lihat jawaban Kenorb, mungkin bisa membantu Anda
Kojo
0

Masalah ini muncul ketika ada node yatim, cukup singkirkan mereka dan cron akan berjalan tanpa kesalahan. Pengindeksan pencarian akhirnya akan mencapai 100%. Cadangkan basis data Anda sebelum melanjutkan.

Dengan asumsi Anda memiliki akses ke phpMyAdmin, jalankan kode SQL ini untuk mengidentifikasi node kemudian menghapusnya. Ganti saya pertanyaan jenis konten nama mesin dengan konten spesifik Anda nama jenis mesin satu demi satu sampai Anda tidak mendapatkan hasil, bahwa setelah menghapus.

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

Anda dapat menghapus node yatim dengan menggunakan kode SQL di bawah ini. Ganti nomor dalam braket dengan ID simpul spesifik Anda

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

Koech
sumber