web-dev-qa-db-ja.com

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

致命的なエラーが発生しましたEntityMalformedException:ノードタイプのエンティティにバンドルプロパティがありません。 entity_extract_ids()(。\ includes\common.incの7700行目)ser/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 propertyエラーについて見つけたものはすべて読みましたが、解決に役立ちませんでした。

dpm($entity)

_uid (String, 2 characters ) 70
name (String, 9 characters ) John
pass (String, 55 characters ) $S$DUwPuOuDPiDL4nRTYXqc7a5uOfMKey7pyhOFUEKka1XM...
mail (String, 30 characters ) [email protected]
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 ) [email protected]
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
_
16
Kojo

クライブのコメントのおかげで、私は次のように問題を解決しました。

エラーが発生した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()

8
Kojo

エラー:

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は、どのような種類のエンティティを扱っているかを認識していません。そのため、エンティティが無効である(たとえば、別のエンティティをロードしている)か、空である可能性があります(_$entity_ is NULL)。


Drupalコードを変更していない場合、これはさまざまな原因で発生する可能性があります(おそらく特定のDrupalモジュールのバグ))。

Drupal core(file:_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']};
  }
_

デバッグ中

上記のいずれも認識できない場合、その種類のエラーをデバッグする最も簡単な方法は、実際の_throw new EntityMalformedException_の前にvar_dump(debug_backtrace());またはdd(debug_backtrace());(Develがオンの場合)を配置することです。 _common.inc_の影響を受ける行。

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

これがノードの保存時に発生している場合は、これを確認してください SOのEntityMalformedExceptionポスト より詳細な手順。


次のDrupal問題: #1778572 も参照してください。).

31
kenorb

この問題は、孤立したノードがある場合に発生します。孤立したノードを取り除くだけで、cronはエラーなしで実行されます。検索のインデックス作成は最終的に100%になります。続行する前にデータベースをバックアップしてください。

PhpMyAdminへのアクセス権があると想定して、このSQLコードを実行してノードを識別し、ノードを削除します。私のquestionコンテンツタイプマシン名を特定のコンテンツタイプマシン名に次々と置き換えて、結果が得られなくなるまで、つまり削除した後です。

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

0
Koech