Làm thế nào để gỡ lỗi EntityMalformedException?


16

Tôi đã gặp lỗi nghiêm trọng EntityMalformedException: Thiếu thuộc tính gói trên thực thể của nút loại. trong entity_extract_ids () (dòng 7700 của. \ bao gồm \ common.inc) khi cố gắng truy cập user / xyz .

Tôi đã cố truy xuất thông tin về nút không đúng định dạng ở dòng 7700, nơi thông báo lỗi được tạo, nghĩ như sau:

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) trả về một đối tượng người dùng bất ngờ và $ thông tin rất nhiều thứ.

Ai đó có thể đưa tôi đi đúng hướng?

Tôi đã đọc bất cứ điều gì tôi có thể tìm thấy về Thiếu lỗi thuộc tính gói , nhưng không có gì giúp giải quyết.

dpm($entity) trả lại

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

Đây thường là một mức độ khá thấp mà bạn có thể tìm ra chỉ bằng cách sử dụng thực thể $. Hãy chắc chắn rằng bạn đang truyền chính thực thể - và không phải là một tập hợp các thực thể mà hàm tải thực thể trả về.
AyeshK

1
Tôi có nghĩa là về cơ bản nó đang kiểm tra nếu thông tin bó tồn tại trước khi ném ngoại lệ. Nếu bạn có thể đăng đầu ra của dpm ($ thực thể) (với thông tin nhạy cảm bị làm mờ tất nhiên), điều đó sẽ giúp người khác thấy những gì sai.
AyeshK

3
@Kojo Nguyên nhân thực sự là một vấn đề thực sự đơn giản ... một cái gì đó đang gọi entity_extract_ids('node', $var);, nhưng thay vì một đối tượng nút $var, nó lại truyền một đối tượng người dùng. Nếu bạn có bất kỳ mô-đun đóng góp phiên bản tùy chỉnh hoặc dev nào, hãy thử vô hiệu hóa từng cái một để xem nó, bạn có thể tìm ra thủ phạm
Clive

2
Rất tiếc. dpm(debug_print_backtrace());sẽ là vô giá ở đây. Bạn có thể thấy mô-đun nào đã khởi động tất cả bằng cách làm theo các chức năng trở lại từ đầu yêu cầu
Clive

1
Đừng lo lắng, nếu bạn có thể cài đặt và cấu hình xdebug với xdebug.collect_params = 4điều đó cũng sẽ giúp cuộc sống của bạn dễ dàng hơn rất nhiều
Clive

Câu trả lời:


29

Lỗi:

EntityMalformedException: Thiếu thuộc tính gói trên thực thể của nút loại.

xảy ra, vì thuộc tính gói của bạn không đúng định dạng khi tải hoặc lưu, vì vậy Drupal không thể tìm thấy loại gói nào.

Logic của Ngoại lệ đó là:

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

Vì vậy, về cơ bản giá trị của $info['entity keys']['bundle'](đối với nút đó là type:) không thể tìm thấy trong $entityđối tượng ( $node->typeđối với nút), do đó Drupal không biết nó đang xử lý loại thực thể nào. Vì vậy, rất có thể thực thể của bạn không hợp lệ (ví dụ: bạn đang tải một cái gì đó khác) hoặc nó chỉ trống ( $entityNULL).


Nếu bạn chưa sửa đổi bất kỳ mã Drupal nào, điều này có khả năng có thể do nhiều nguyên nhân khác nhau (rất có thể là do lỗi mô-đun Drupal cụ thể), chẳng hạn như:

Đây là mã chịu trách nhiệm mà được ném bởi 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']};
  }

Gỡ lỗi

Nếu bạn không nhận ra bất cứ điều gì ở trên, điều dễ dàng nhất để gỡ lỗi loại lỗi đó là bằng cách đặt var_dump(debug_backtrace());hoặc dd(debug_backtrace());(khi bật Devel) trước khi thực tế throw new EntityMalformedExceptiontrên dòng bị ảnh hưởng common.inc.

Lưu ý: Sử dụng dd()chức năng từ Devel sẽ tạo thông tin gỡ lỗi cho tệp trong thư mục tạm thời Drupal ( temporary://drupal_debug.txt) của bạn với kết xuất ngược, nếu không có thể quá lớn và khó đọc khi đổ trên màn hình. Khi sử dụng var_dump(), việc gọi die();sau cuộc gọi sẽ dễ dàng hơn và kiểm tra kết xuất ở chế độ nguồn xem của trang.

Nếu điều này xảy ra khi lưu nút, hãy kiểm tra bài đăng EntityMalformedException này tại SO để biết hướng dẫn chi tiết hơn.


Xem thêm vấn đề Drupal sau: # 1778572 để biết thêm ý tưởng.


2
Kudos cho một câu trả lời chi tiết như vậy! Tôi đã giải quyết vấn đề của mình từ lâu, nhưng không nghi ngờ rằng điều này sẽ hữu ích cho rất nhiều người, bao gồm cả tôi.
Kojo

3
Đây là một câu trả lời tuyệt vời! Xứng đáng hơn upvote.
Christian

Tôi đã thêm vào dd(debug_backtrace());dòng bị ảnh hưởng ở phía trước throw new EntityMalformedException, đảm bảo Devel được bật và chạy lệnh drush trong cron đang ném lỗi này và không nhận được bất kỳ đầu ra gỡ lỗi nào. Tôi đã làm gì sai? Cảm ơn!
Christia

1
Tìm thấy nó: lệnh đã tạo một tệp có tên drupal_debug.txtbên trong trong /tmp/drupal_theme/đó "drupal_theme" là tên của chủ đề drupal. Cảm ơn sự giúp đỡ gỡ lỗi tuyệt vời của bạn!
Christia

8

Nhờ bình luận của Clive, tôi đã giải quyết vấn đề như sau.

Đã thêm vào ddebug_backtrace()nơi xảy ra lỗi ( entity_extract_ids (), dòng 7700 của. \ Bao gồm \ common.inc ) để in ngăn xếp cuộc gọi hàm.

Sau đó tìm kiếm bất cứ điều gì bất ngờ ở đầu ra, tôi thấy rằng một quy tắc hiển thị khung có thể là vấn đề.

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

Tôi đã áp dụng một bản vá vào entity_field_value.incmột vài ngày trước chỉ để giải quyết thông báo quy tắc hiển thị ... và tạo quy tắc hiển thị thử nghiệm với điều kiện field_theme.

Bây giờ hoàn nguyên bản vá hoặc xóa bất kỳ quy tắc hiển thị khung nào đã giải quyết lỗi EntityMalformedException hiện tại ... Mạnh mẽ ddebug_backtrace()!


Tôi đã thử phương pháp này và tôi đã nhận được 1000 dòng mã ở mặt trước. Làm thế nào để bạn thấy lỗi ở đâu?
Sam

@Sam hãy xem câu trả lời của Kenorb, nó có thể giúp bạn
Kojo

0

Vấn đề này xuất hiện khi có các nút mồ côi, chỉ cần thoát khỏi chúng và cron sẽ chạy mà không có bất kỳ lỗi nào. Tìm kiếm chỉ mục cuối cùng sẽ nhận được đến 100%. Sao lưu cơ sở dữ liệu của bạn trước khi tiến hành.

Giả sử bạn có quyền truy cập vào phpMyAdmin, hãy chạy mã SQL này để xác định các nút sau đó xóa chúng. Thay thế tên máy nội dung câu hỏi của tôi bằng tên máy nội dung cụ thể của bạn lần lượt cho đến khi bạn không có kết quả, đó là sau khi xóa.

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

Bạn có thể xóa các nút mồ côi bằng cách sử dụng mã SQL bên dưới. Thay thế các số trong ngoặc bằng ID nút cụ thể của bạn

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.