Comment déboguer EntityMalformedException?


16

J'ai une erreur fatale EntityMalformedException: propriété de bundle manquante sur l'entité de type noeud. dans entity_extract_ids () (ligne 7700 de. \ includes \ common.inc) lorsque vous essayez d'accéder à user / xyz .

J'ai essayé de récupérer des informations sur le nœud mal formé à la ligne 7700, où le message d'erreur est généré, pense comme:

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) renvoie un objet utilisateur inattendu, et $ info une énorme quantité de choses.

Quelqu'un pourrait-il me mettre sur la bonne voie?

J'ai déjà lu tout ce que je pouvais trouver sur les erreurs de propriété de bundle manquantes , mais aucune n'a aidé à les résoudre.

dpm($entity) Retour

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

C'est généralement un niveau assez bas que vous pouvez découvrir simplement en dpm () en entant l'entité $. Assurez-vous de transmettre l'entité elle-même - et non un ensemble d'entités renvoyées par les fonctions de chargement d'entité.
AyeshK

1
Je voulais dire qu'il vérifie essentiellement si les informations sur le bundle existent avant de lever l'exception. Si vous pouviez publier la sortie de dpm ($ entity) (avec les informations sensibles floues bien sûr), cela aidera les autres à voir ce qui ne va pas.
AyeshK

3
@Kojo La cause est en fait très simple ... quelque chose appelle entity_extract_ids('node', $var);, mais au lieu d'un objet nœud pour $var, il passe un objet utilisateur. Si vous avez des modules de contrib de version personnalisée ou de développement, essayez de les désactiver un par un pour le voir, vous pouvez trouver le coupable
Clive

2
Oui. dpm(debug_print_backtrace());sera inestimable ici. Vous pouvez voir quel module a tout déclenché en suivant les fonctions depuis le début de la requête
Clive

1
Pas de soucis, si vous pouvez installer et configurer xdebug, xdebug.collect_params = 4cela vous facilitera également la vie
Clive

Réponses:


30

L'erreur:

EntityMalformedException: propriété de bundle manquante sur l'entité de type noeud.

se produit, car votre propriété de bundle est mal formée lors du chargement ou de la sauvegarde, donc Drupal ne peut pas trouver de quel type de bundle il s'agit.

La logique de cette exception est la suivante:

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

Donc, fondamentalement, la valeur de $info['entity keys']['bundle'](pour le nœud c'est:) ne typepeut pas être trouvée dans l' $entityobjet ( $node->typepour le nœud), donc Drupal ne sait pas avec quel type d'entité il s'agit. Donc, très probablement, votre entité n'est pas valide (par exemple, vous chargez quelque chose d'autre à la place) ou elle est juste vide ( $entityest NULL).


Si vous n'avez modifié aucun code Drupal, cela peut potentiellement être causé par diverses choses (très probablement par un bogue spécifique du module Drupal), telles que:

Voici le code responsable qui est jeté par le noyau Drupal (fichier:) 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']};
  }

Débogage

Si vous ne reconnaissez rien ci-dessus, la chose la plus simple pour déboguer ce type d'erreur est de placer var_dump(debug_backtrace());ou dd(debug_backtrace());(lorsque Devel est activé) avant le réel throw new EntityMalformedExceptionsur la ligne affectée common.inc.

Remarque: L'utilisation de la dd()fonction de Devel générera les informations de débogage dans le fichier de votre dossier temporaire Drupal ( temporary://drupal_debug.txt) avec vidage de trace, sinon il pourrait être trop volumineux et difficile à lire lors du vidage à l'écran. Lors de l'utilisation var_dump(), il est plus facile d'appeler die();après l'appel et de vérifier le vidage en mode source d'affichage de la page.

Si cela se produit lors de l'enregistrement du nœud, consultez ce post EntityMalformedException sur SO pour des instructions plus détaillées.


Voir également le problème Drupal suivant: # 1778572 pour plus d'idées.


2
bravo pour une réponse si détaillée! J'ai résolu mon problème il y a longtemps, mais il ne fait aucun doute que cela sera utile pour beaucoup de gens, moi y compris.
Kojo

3
C'est une réponse fantastique! Mérite plus de votes positifs.
Christian

J'ai ajouté dd(debug_backtrace());à la ligne affectée en face de throw new EntityMalformedException, vérifié que Devel est activé et exécuté la commande drush dans cron qui génère cette erreur et je n'obtiens aucune sortie de débogage. Qu'ai-je fait de mal? Merci!
Christia

1
Trouvé: la commande a créé un fichier appelé à l' drupal_debug.txtintérieur /tmp/drupal_theme/où "drupal_theme" est le nom du thème drupal. Merci pour votre excellente aide au débogage!
Christia

8

Grâce aux commentaires de Clive, j'ai résolu le problème comme suit.

Ajouté ddebug_backtrace()là où l'erreur s'est produite ( entity_extract_ids (), ligne 7700 de. \ Includes \ common.inc ) pour imprimer la pile d'appels de fonction.

Puis, à la recherche de quelque chose d'inattendu dans la sortie, j'ai constaté qu'une règle de visibilité du volet pouvait être le problème.

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

J'avais appliqué un patch il y entity_field_value.inca quelques jours seulement pour résoudre un avis de règle de visibilité ... et créé une règle de visibilité de test avec une condition field_theme.

Désormais, la restauration du correctif ou la suppression de toute règle de visibilité de volet a résolu le bogue EntityMalformedException actuel ... Puissant ddebug_backtrace()!


J'ai essayé cette méthode et j'ai reçu des milliers de lignes de code à l'avant. Comment voyez-vous où est l'erreur?
Sam

@Sam jetez un œil à la réponse de Kenorb, cela pourrait vous aider
Kojo

0

Ce problème survient lorsqu'il y a des nœuds orphelins, supprimez-les simplement et cron s'exécutera sans aucune erreur. L'indexation de la recherche atteindra enfin 100%. Sauvegardez votre base de données avant de continuer.

En supposant que vous ayez accès à phpMyAdmin, exécutez ce code SQL pour identifier les nœuds puis supprimez-les. Remplacez mon nom de machine de type de contenu de question par votre nom de machine de type de contenu spécifique l'un après l'autre jusqu'à ce que vous n'obteniez aucun résultat, c'est-à-dire après la suppression.

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

Vous pouvez supprimer les nœuds orphelins en utilisant le code SQL ci-dessous. Remplacez les numéros dans le support par vos ID de nœud spécifiques

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.