2013-08-15 2 views
1

에 정의 된 경우에도 법인의 게터에서 정의되지 않은 인덱스 : 나는 심포니의 폼 빌더 양식을 contruct 때인덱스가 나는 다음과 같은 정보가 포함 된 엔티티 클래스가 생성자

class A 
{ 
    ... 
    private $share_data; 
    public function __construct() 
    { 
     $this->share_data = array(
      'title' => null, 
      'text' => null, 
      'image' => null, 
      'tab_image' => null 
     ); 
    } 
    ... 
    public function getTabImage() 
    { 
     return $this->share_data['tab_image']; 
    } 

, 나는 다음과 같은 코드를 사용합니다 :

내 코드를 실행하려고하면
$builder->add('tab_image', 'text', array('required'=>false, 'mapped'=>true, 'label'=>'a.form.tab.image_url')) 

그래서 나는 오류를 주의를 얻을 : 정의되지 않은 인덱스 : tab_image에 ...

I f를 왜냐하면 내 데이터베이스에서 json_array (share_data)라는 열 유형이 있으므로 setShareData가 호출 될 것이기 때문입니다. 데이터베이스 값에서만 제목, 텍스트 및 이미지 필드가 json 객체에 정의됩니다. 따라서 객체는 tab_image 키가없는 배열에 아마도 덮어 쓰여질 것입니다. 나는 다음에 setShareData을 변경하여이 문제를 해결하려고 :

public function setShareData($shareData) 
{ 
    // merge so that null values are default 
    $this->share_data = array_merge($this->share_data, $shareData); 

    return $this; 
} 

는 생성자에서 설정 한 tab_index 키를 보존 바라고. 하지만 아직 정의되지 않은 색인 오류가 나타납니다. tab_image 키가 설정되지 않았을 때 null로 유지할 수있는 방법이 있습니까?

각 getter에서 isset을 확인하지 않고도 배열/json 객체에 새 키를 추가 할 수 있도록이 문제를 해결하고 싶습니다. 당연히 새롭게 생성 된 객체는 tab_image 키를 얻습니다.하지만이 객체는 이전 버전과 호환되기를 바랍니다.

답변

0

그래서 당신은 데이터베이스에서이 엔티티를 당기는 __construct 오타 누락하려고했다?

Doctrine은 개체를 수분 보충 할 때 생성자를 호출하지 않습니다. 조금 마법이지만 속성은 직접 설정됩니다. 사실, setSharedData는 수화 중에도 호출되지 않습니다.

당신은 포스트로드 수명주기 이벤트 (http://docs.doctrine-project.org/en/latest/reference/events.html)

수신과 같은 같은 것을 수행 할 수 있습니다

private function getSharedDataTemplate() 
{ 
    return array(
     'title' => null, 
     'text' => null, 
     'image' => null, 
     'tab_image' => null 
    ); 
} 
public function __construct() 
{ 
    // For new'ing objects 
    $this->share_data = $this->getSharedDataTemplate(); 
} 
/** @PostLoad */ 
public function doStuffOnPostLoad() 
{ 
    // merge so that null values are default 
    $this->share_data = array_merge($this->getSharedDataTemplate(), $this->share_data); 
    return $this; 
} 

당신은 또한 플래그의 일종을 설정하고 항상을 선택하여 작업 할 수 있습니다 데이터를 병합해야하는지 확인하십시오. 그러나 수명주기 접근법은 더 깨끗합니다.

+0

알았어, 생성자가 수화에 호출되지 않았다는 것을 몰랐다. 감사. – juuga

0

당신은, 당신은의

+0

실제로 이것은 오타가 되었기 때문에 코드에서 올바르게'__construct'입니다. – juuga

+0

@juuga array_merge 전에 print_r ($ shareData) 및 print_r ($ this-> share_data)를 사용하면 어떻게됩니까? – MajorCaiger

관련 문제