当前位置: 首页>>建站开发>>正文


如何调试EntityMalformedException?

webfans 建站开发 , , 去评论

问题描述

我有致命的错误EntityMalformedException:在类型node的实体上缺少bundle属性。尝试访问user /xyz时,in entity_extract_ids()(。\ includes \ common.inc的第7700行)。

我尝试在第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大量的东西。

有人能让我走正确的路吗?

我已经阅读了有关Missing bundle属性错误的任何内容,但没有人帮助解决。

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

最佳解决方法

错误:

EntityMalformedException: Missing bundle property on entity of type node.

发生这种情况,因为你的bundle属性在加载或保存时都是格式错误的,所以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)));
}

因此,在$entity对象(节点的$node->type)中找不到$info['entity keys']['bundle'](对于节点:type)的基本值,因此Drupal不知道它正在处理什么类型的实体。因此,您的实体很可能无效(例如,您正在加载其他内容)或者它只是空的($entityNULL)。


如果你没有修改任何Drupal代码,这可能是由各种各样的东西引起的(很可能是由特定的Drupal模块bug),例如:

这是Drupal核心抛出的负责代码(文件: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

如果您不识别上述任何内容,则调试此类错误的最简单方法是在common.inc中受影响的线路上的实际throw new EntityMalformedException之前放置var_dump(debug_backtrace());dd(debug_backtrace());(当Devel打开时)。

注意:使用Devel的dd()函数将使用回溯转储生成Drupal temp folder(temporary://drupal_debug.txt)文件的调试信息,否则在屏幕上转储时可能太大而且难以读取。使用var_dump()时,调用后调用die();更容易,并在页面的view-source模式下检查转储。

如果在节点保存时发生这种情况,请检查此EntityMalformedException post at SO以获取更详细的说明。


另请参阅以下Drupal问题:#1778572以获取更多想法。

次佳解决方法

感谢克莱夫的评论,我解决了以下问题。

添加了发生错误的ddebug_backtrace()(entity_extract_ids(),。\ includes \ common.inc的第7700行)以打印函数调用堆栈。

然后在输出中查找任何意外的内容,我发现窗格可见性规则可能是问题所在。

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上应用了一个补丁,只是to solve a visibility rule notice …并创建了一个带有field_theme条件的测试可见性规则。

现在还原补丁或删除任何窗格可见性规则解决了当前的EntityMalformedException错误…强大的ddebug_backtrace()

参考资料

本文由朵颐IT整理自网络, 文章地址: https://duoyit.com/article/2713.html,转载请务必附带本地址声明。