Как отладить EntityMalformedException?

16

Я получил фатальную ошибку EntityMalformedException: отсутствует свойство пакета на объекте типа узла. в entity_extract_ids () (строка 7700 из. \ includes \ common.inc) при попытке доступа к user / 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 - огромное количество вещей.

Может ли кто-нибудь поставить меня на правильный путь?

Я уже прочитал все, что мог найти об ошибках в свойствах 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
Коджо
источник
Обычно это довольно низкий уровень, который вы можете узнать просто с помощью dpm () с помощью сущности $. Убедитесь, что вы передаете сам объект, а не набор объектов, возвращаемых функциями загрузки объекта.
AyeshK
1
Я имел в виду, что он в основном проверяет, существует ли информация о пакете, прежде чем выдавать исключение. Если бы вы могли опубликовать вывод dpm ($ entity) (конечно, с секретной информацией, размытой), это поможет другим понять, что не так.
AyeshK
3
@Kojo Причина на самом деле очень проста ... что-то вызывает entity_extract_ids('node', $var);, но вместо объекта узла $varон передает объект пользователя. Если у вас есть пользовательские модули или модули для разработки версий, попробуйте отключить их один за другим, чтобы увидеть, что вы можете найти виновника
Clive
2
Хлоп. dpm(debug_print_backtrace());будет неоценимым здесь. Вы можете увидеть , что модуль начал все это прочь, следуя функции вернуться к началу запроса
Клайв
1
Не беспокойтесь, если вы сможете установить и настроить xdebug xdebug.collect_params = 4, это также сделает вашу жизнь намного проще
Clive

Ответы:

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'](для узла it:) typeневозможно найти в $entityобъекте ( $node->typeдля узла), поэтому Drupal не знает, с каким типом сущности он имеет дело. Поэтому, скорее всего, ваша сущность недействительна (например, вы загружаете что-то другое) или она просто пуста ( $entityесть 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 создаст отладочную информацию для файла в вашей временной папке Drupal (temporary://drupal_debug.txt ) с дампом обратной трассировки, в противном случае он может быть слишком большим и трудным для чтения при выводе на экран. При использовании var_dump()проще позвонить die();после звонка и проверить дамп в режиме просмотра источника на странице.

Если это происходит при сохранении узла, проверьте эту запись EntityMalformedException в SO для получения более подробных инструкций.


Смотрите также следующую проблему Drupal: # 1778572 для большего количества идей.

kenorb
источник
2
слава за такой подробный ответ! Я решил свою проблему давным-давно, но не сомневаюсь, что это будет полезно для многих людей, включая меня.
Кодзё
3
Это фантастический ответ! Заслуживает больше голосов.
Кристиан
Я добавил dd(debug_backtrace());к соответствующей строке перед собой throw new EntityMalformedException, убедился, что Devel включен, и выполнил команду drush в cron, которая выдает эту ошибку и не получает никаких результатов отладки. Что я сделал не так? Благодарность!
Кристия
1
Нашел его: команда создала файл с именем drupal_debug.txtвнутри, /tmp/drupal_theme/где "drupal_theme" - это название темы drupal. Спасибо за вашу отличную помощь в отладке!
Кристия
8

Благодаря комментариям Клайва я решил проблему следующим образом.

Добавлено, ddebug_backtrace()когда произошла ошибка ( entity_extract_ids (), строка 7700 из. \ Includes \ 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()!

Коджо
источник
Я попробовал этот метод, и я получил тысячи строк кода на переднем конце. Как вы видите, где ошибка?
Сэм
@ Сам взгляни на ответ Кенорба, он может тебе помочь
Кодзё
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. Замените числа в скобках на ваши конкретные идентификаторы узлов

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

Koech
источник