如何调试EntityMalformedException?


16

我遇到了致命错误EntityMalformedException:类型节点的实体上缺少捆绑属性。 尝试访问user / xyz时,在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包含大量信息。

有人可以让我走对路吗?

我已经读了所有关于缺少捆绑软件属性错误的信息,但是没有一个可以解决。

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 2014年

1
我的意思是,它基本上是在引发异常之前检查捆绑软件信息是否存在。如果您可以发布dpm($ entity)的输出(当然会使敏感信息模糊),那将有助于其他人查看问题所在。
AyeshK 2014年

3
@Kojo原因实际上是一个非常简单的原因...正在调用entity_extract_ids('node', $var);,但是$var它传递了一个用户对象,而不是它的节点对象。如果您有任何自定义或开发版本的contrib模块,请尝试逐个禁用它们,以查看是否有罪魁祸首
Clive

2
kes。dpm(debug_print_backtrace());在这里将是无价之宝。你可以看到模块由以下功能回请求年初开始全部关闭
克莱夫

1
不用担心,如果可以安装和配置xdebug,xdebug.collect_params = 4这也将使您的生活更加轻松
Clive

Answers:


30

错误:

EntityMalformedException:类型节点的实体上缺少捆绑属性。

发生这种情况是因为您的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)));
}

所以基本上价值$info['entity keys']['bundle'](节点是:type)无法找到$entity对象($node->type为节点),因此Drupal的不知道用什么样的实体它在处理。因此,您的实体很可能是无效的(例如,您正在加载其他内容)或只是空的($entityis NULL)。


如果您尚未修改任何Drupal代码,则可能是由多种原因引起的(很可能是由特定的Drupal模块错误引起的),例如:

这是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']};
  }

调试

如果您没有发现上述任何错误,最容易调试这种错误的方法是将var_dump(debug_backtrace());dd(debug_backtrace());(当Devel启用时)throw new EntityMalformedException放在受影响的行中的实际位置之前common.inc

注意:使用dd()Devel中的功能将通过backtrace dump 将调试信息生成到您的Drupal temp文件夹temporary://drupal_debug.txt)中的文件,否则在屏幕上进行转储时可能太大且难以阅读。使用时var_dump(),调用起来更容易die();之后,并在页面的视图源模式下检查转储。

如果在保存节点时发生这种情况,请查看SO上的EntityMalformedException帖子以获取更多详细说明。


另请参见以下Drupal问题:#1778572


2
如此详细的答案表示敬意!我很久以前就解决了我的问题,但毫无疑问,这将对包括我在内的许多人有所帮助。
Kojo 2015年

3
这是一个了不起的答案!应该得到更多的支持。
基督教徒

dd(debug_backtrace());在的前面添加了受影响的行throw new EntityMalformedException,确保已启用Devel并在cron中运行了drush命令,该命令抛出此错误并且没有任何调试输出。我做错了什么?谢谢!
Christia

1
找到它:该命令创建了一个名为drupal_debug.txtinside 的文件,/tmp/drupal_theme/其中“ drupal_theme”是drupal主题的名称。感谢您的出色调试帮助!
Christia

8

感谢Clive的评论,我如下解决了这个问题。

添加了ddebug_backtrace()发生错误的位置(._includes \ common.inc的entity_extract_ids(),第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几天前才申请了补丁来解决可见性规则通知 ……并创建了一个具有field_theme条件的测试可见性规则。

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


我尝试了这种方法,并在前端获得了1000行的代码。您如何看待错误所在?
山姆

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.