EntityMalformedException을 디버깅하는 방법?


16

나는 치명적인 오류있어 EntityMalformedException을 : 유형 노드의 실체에 번들 특성이 없습니다. user / xyz에 액세스하려고 할 때 entity_extract_ids () (. \ includes \ common.inc의 7700 행) 에 있습니다 .

오류 메시지가 작성되는 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

1
나는 기본적으로 예외를 던지기 전에 번들 정보가 있는지 확인하는 것을 의미했습니다. dpm ($ entity) 출력을 게시 할 수 있다면 (물론 민감한 정보가 흐리게 표시됨) 다른 사람들이 무엇이 잘못되었는지 알 수 있습니다.
AyeshK

3
@Kojo 원인은 실제로 매우 간단한 원인입니다. 뭔가 호출 entity_extract_ids('node', $var);하고 있지만에 대한 노드 객체 대신 $var사용자 객체를 전달합니다. 사용자 정의 또는 개발 버전 contrib 모듈이있는 경우 해당 모듈을 하나씩 비활성화하여 범인을 찾을 수 있는지 확인하십시오.
Clive

2
Yikes. dpm(debug_print_backtrace());여기서 귀중한 것입니다. 요청의 시작 부분으로 돌아가 기능을 수행하여 어떤 모듈이 모든 모듈을 시작했는지 확인할 수 있습니다.
Clive

1
걱정하지 마십시오. xdebug를 설치하고 구성 할 수 있다면 xdebug.collect_params = 4인생도 훨씬 쉬워 질 것입니다
Clive

답변:


31

오류:

EntityMalformedException : node 유형의 엔티티에서 번들 특성이 누락되었습니다.

번들 속성이로드 또는 저장시 형식이 잘못 되었기 때문에 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에서 찾을 수 없으므로 Drupal은 처리하는 엔티티의 종류를 알지 못합니다. 따라서 엔티티가 유효하지 않거나 (예 : 대신 다른 것을로드하고 있음) 비어있는 것입니다 ( is ).$entity$node->type$entityNULL


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 temp 폴더 ( temporary://drupal_debug.txt) 의 파일에 디버깅 정보가 생성됩니다. 그렇지 않으면 화면에 덤프 할 때 너무 커서 읽기가 어려울 수 있습니다. 를 사용하면 var_dump()호출 die();후 호출하고 페이지의 소스보기 모드에서 덤프를 확인하는 것이 더 쉽습니다 .

이 작업이 노드 저장에서 발생하는 경우 자세한 지시 사항 은 SO 의이 EntityMalformedException 게시물을 확인하십시오 .


자세한 내용은 다음 Drupal 문제 : # 1778572 를 참조하십시오.


2
자세한 답변을 원하시면 나는 오래 전에 내 문제를 해결했지만 의심 할 여지없이 많은 사람들에게 도움이 될 것입니다.
Kojo

3
이것은 환상적인 답변입니다! 더 많은 공감 비가 필요합니다.
Christian

dd(debug_backtrace());영향을받는 줄 앞에 추가 하여 throw new EntityMalformedExceptionDevel이 활성화되어 있는지 확인하고 cron에서 drush 명령을 실행 하여이 오류가 발생하고 디버깅 출력이 표시되지 않습니다. 내가 뭘 잘못 했어? 감사!
Christia

1
그것을 찾았습니다. 명령은 drupal_debug.txt내부 /tmp/drupal_theme/에서 "drupal_theme"이 drupal 테마의 이름 인 파일을 작성했습니다 . 훌륭한 디버깅 도움을 주셔서 감사합니다!
Christia

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 줄의 코드를 얻었다. 오류가 어디에 있는지 어떻게 알 수 있습니까?
Sam

@Sam Kenorb의 답변을 살펴보면 도움이 될 것입니다.
Kojo

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.