EntityMalformedExceptionをデバッグする方法は?


16

致命的なエラーEntityMalformedException があります:タイプノードのエンティティにバンドルプロパティがありません。entity_extract_idsで()(ラインの7700は。\ \ common.incを含んで)アクセスユーザー/ 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は膨大な量のものを返します。

誰かが正しい方法で私を置くことができますか?

バンドルプロパティが見つからないというエラーについては、すでに見つけたものをすべて読みましたが、解決に役立つものはありませんでした。

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

これは通常、かなり低いレベルのもので、$ entityをdpm()するだけで確認できます。エンティティの読み込み関数が返すエンティティのセットではなく、エンティティ自体を渡すようにしてください。
AyeshK 14

1
基本的に、例外をスローする前にバンドル情報が存在するかどうかをチェックするということです。dpm($ entity)の出力(機密情報はもちろんぼやけています)を投稿できれば、他の人が何が悪いのかを知るのに役立ちます。
AyeshK 14

3
@Kojo原因は実際には本当に簡単なものです...何かが呼び出してentity_extract_ids('node', $var);いますが、のノードオブジェクトの代わりに$var、ユーザーオブジェクトを渡しています。あなたが任意のカスタムやdevのバージョンcontribモジュールを持っている場合は、あなたが犯人を見つけることができ、それを見るためにそれらを一つずつを無効にしてみてください
クライヴ

2
うわぁ。dpm(debug_print_backtrace());ここで非常に貴重です。あなたは、モジュールがバック要求の先頭に機能に従うことにより、すべてのスタートを切ったものを見ることができます
クライヴ

1
心配ない、あなたはxdebugのをインストールして構成得ることができる場合xdebug.collect_params = 4も、非常に簡単にあなたの人生を行いますその
クライヴ

回答:


29

エラー:

EntityMalformedException:タイプノードのエンティティにバンドルプロパティがありません。

バンドルプロパティがロード時または保存時に不正な形式であるため、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 EntityMalformedExceptioncommon.inc

注:dd()Develの関数を使用すると、バックトレースダンプを使用してDrupal一時フォルダーtemporary://drupal_debug.txt)のファイルにデバッグ情報が生成されます。そうしないと、画面にダンプするときに大きすぎて読みにくくなります。を使用する場合var_dump()、呼び出すのが簡単ですdie();後に呼び出して、ページのソース表示モードでダンプを確認するです。

これがノードの保存で発生する場合、SOでこのEntityMalformedExceptionの投稿を確認して、詳細な手順を確認してください。


その他のアイデアについては、次のDrupalの問題も参照してください:#1778572


2
このような詳細な回答に感謝します!私はずっと前に私の問題を解決しましたが、これは私を含めて多くの人々にとって役立つことを疑う余地はありません。
古城

3
これは素晴らしい答えです!より多くの賛成に値する。
クリスチャン

dd(debug_backtrace());前に影響を受ける行に追加し、throw new EntityMalformedExceptionDevelが有効になっていることを確認し、cronでdrushコマンドを実行しました。このコマンドはこのエラーをスローし、デバッグ出力を取得しません。私は何を間違えましたか?ありがとう!
クリスティ

1
それを見つけました:コマンドは、「drupal_theme」がdrupalテーマの名前であるdrupal_debug.txtinside というファイルを作成しました/tmp/drupal_theme/。優れたデバッグヘルプをありがとう!
クリスティ

8

Cliveのコメントのおかげで、次のように問題を解決しました。

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だけに、数日前にパッチを適用しました ...そして、field_theme条件で可視性ルールのテストを作成しました。

パッチを元に戻すか、ペインの可視性ルールを削除することで、現在のEntityMalformedExceptionバグを解決しました...強力ddebug_backtrace()です!


この方法を試してみましたが、フロントエンドで1000行のコードを取得しました。エラーの場所をどのように確認しますか?
サム

Kenorbの答えを見て、それはあなたを助けるかもしれない@Sam
古城

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)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.