Wie debugge ich EntityMalformedException?

16

Es liegt ein schwerwiegender Fehler vor. EntityMalformedException: Fehlende Bundle-Eigenschaft für Entität vom Typ Node. in entity_extract_ids () (Zeile 7700 von. \ includes \ common.inc), wenn versucht wird, auf user / xyz zuzugreifen .

Ich habe versucht, Informationen über den fehlerhaften Knoten in Zeile 7700 abzurufen, in der die Fehlermeldung angezeigt wird.

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) Gibt ein unerwartetes Benutzerobjekt und $ info eine große Menge von Dingen zurück.

Könnte mich jemand auf den richtigen Weg bringen?

Ich habe bereits alles gelesen, was ich über fehlende Bundle-Eigenschaftsfehler finden konnte , aber keiner hat beim Lösen geholfen.

dpm($entity) kehrt zurück

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
Kojo
quelle
Dies ist normalerweise eine ziemlich niedrige Stufe, die Sie herausfinden können, indem Sie einfach dpm () 'ing the $ entity ausführen. Stellen Sie sicher, dass Sie die Entität selbst übergeben - und nicht eine Reihe von Entitäten, die von Entitätsladefunktionen zurückgegeben werden.
AyeshK
1
Ich meinte, es wird grundsätzlich geprüft, ob die Bundle-Informationen vorhanden sind, bevor die Ausnahme ausgelöst wird. Wenn Sie die Ausgabe von dpm ($ entity) posten könnten (wobei die vertraulichen Informationen natürlich unscharf sind), würde dies anderen helfen, zu erkennen, was nicht stimmt.
AyeshK
3
@Kojo Die Ursache ist eigentlich sehr einfach ... etwas ruft auf entity_extract_ids('node', $var);, aber anstelle eines Node-Objekts $varwird ein Benutzerobjekt übergeben. Wenn Sie benutzerdefinierte oder Entwickler-Module haben, deaktivieren Sie diese nacheinander, um zu sehen, ob Sie den Täter finden
Clive
2
Huch. dpm(debug_print_backtrace());wird hier von unschätzbarem Wert sein. Sie können sehen, von welchem ​​Modul alles gestartet wurde, indem Sie die Funktionen bis zum Beginn der Anforderung zurückverfolgen
Clive
1
Keine Sorge, wenn Sie xdebug damit installieren und konfigurieren können xdebug.collect_params = 4, wird dies auch Ihr Leben erheblich erleichtern
Clive

Antworten:

29

Der Fehler:

EntityMalformedException: Fehlende Bundle-Eigenschaft für Entität vom Typ Node.

Dies passiert, weil Ihre Bundle-Eigenschaft beim Laden oder Speichern fehlerhaft ist, sodass Drupal nicht finden kann, um welche Art von Bundle es sich handelt.

Die Logik dieser Ausnahme lautet:

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

Im Grunde genommen kann der Wert von $info['entity keys']['bundle'](für den Knoten ist es type:) nicht im $entityObjekt ( $node->typefür den Knoten) gefunden werden, daher weiß Drupal nicht, mit welcher Art von Entität es zu tun hat. Höchstwahrscheinlich ist Ihre Entität ungültig (z. B. laden Sie stattdessen etwas anderes) oder sie ist nur leer ( $entityist NULL).


Wenn Sie keinen Drupal-Code geändert haben, kann dies möglicherweise auf verschiedene Ursachen zurückzuführen sein (höchstwahrscheinlich auf einen bestimmten Fehler im Drupal-Modul), z. B .:

Hier ist der verantwortliche Code, der vom Drupal-Kern (Datei:) ausgegeben wird 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']};
  }

Debuggen

Wenn Sie oben nichts erkennen, ist es am einfachsten, diese Art von Fehler zu beheben, indem Sie var_dump(debug_backtrace());oder dd(debug_backtrace());(wenn Devel aktiviert ist) vor dem tatsächlichen throw new EntityMalformedExceptionin der betroffenen Zeile einfügen common.inc.

Hinweis: Wenn Sie die dd()Funktion von Devel verwenden, werden die Debugging-Informationen für die Datei in Ihrem Drupal-temporären Ordner ( temporary://drupal_debug.txt) mit Backtrace- Speicherauszug generiert. Andernfalls kann der Speicherauszug auf dem Bildschirm zu groß und schwer lesbar sein. Bei der Verwendung var_dump()ist es einfacher, die();nach dem Anruf anzurufen und den Speicherauszug im Quellansichtsmodus der Seite zu überprüfen.

Wenn dies beim Speichern des Knotens geschieht, überprüfen Sie diesen EntityMalformedException-Beitrag auf SO, um ausführlichere Anweisungen zu erhalten.


Weitere Ideen finden Sie auch in der folgenden Drupal-Ausgabe: # 1778572 .

Kenorb
quelle
2
Ein großes Lob für eine so ausführliche Antwort! Ich habe mein Problem vor langer Zeit gelöst, aber zweifellos wird dies für viele Menschen hilfreich sein, auch für mich.
Kojo
3
Das ist eine fantastische Antwort! Verdient mehr Upvotes.
Christian
Ich fügte dd(debug_backtrace());der betroffenen Zeile vor hinzu throw new EntityMalformedException, stellte sicher, dass Devel aktiviert ist, und führte den Befehl drush in cron aus, der diesen Fehler auslöst, und erhalte keine Debug-Ausgabe. Was habe ich falsch gemacht? Vielen Dank!
Christia
1
Gefunden: Der Befehl hat eine Datei mit dem Namen drupal_debug.txtinside erstellt, /tmp/drupal_theme/wobei "drupal_theme" der Name des Drupal-Themas ist. Vielen Dank für Ihre hervorragende Hilfe beim Debuggen!
Christia
8

Dank Clive-Kommentaren habe ich das Problem folgendermaßen gelöst.

Hinzugefügt, ddebug_backtrace()wo ein Fehler aufgetreten ist ( entity_extract_ids (), Zeile 7700 von. \ Includes \ common.inc ), um den Funktionsaufrufstapel zu drucken.

Auf der Suche nach etwas Unerwartetem in der Ausgabe stellte ich fest, dass eine Sichtbarkeitsregel möglicherweise das Problem ist.

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

Ich hatte vor entity_field_value.incein paar Tagen einen Patch angewendet , um eine Sichtbarkeitsregel zu lösen ... und eine Testsichtbarkeitsregel mit einer field_theme-Bedingung erstellt.

Das Zurücksetzen des Patches oder das Entfernen von Sichtbarkeitsregeln für Fenster löste jetzt den aktuellen EntityMalformedException-Fehler ... Leistungsstark ddebug_backtrace()!

Kojo
quelle
Ich habe diese Methode ausprobiert und am Frontend 1000 Zeilen Code erhalten. Wie sehen Sie, wo der Fehler liegt?
Sam,
@ Sam werfen Sie einen Blick auf Kenorb Antwort, es könnte Ihnen helfen
Kojo