2012-07-06 3 views
1

모바일 사용자가 REST 서비스를 통해 "주택"을 만들고 업데이트 할 수있게 해주는 Symfony2 앱을 작성 중입니다. MongoDB를 저장 계층으로 사용하고 Doctrine MongoDB ODM을 사용하여 문서 처리를 수행합니다.Doctrine Mongo ODM이 외부에서 수정 한 데이터와 합치기

GET /homes/{key}POST /homes 방법이 정상적으로 작동합니다. 문제는 기존 홈을 PUT /homes/{key}으로 업데이트하려고 할 때 발생합니다.

여기에 현재 코드입니다 :

/** 
* PUT /homes/{key} 
* 
* Updates an existing Home. 
* 
* @param Request $request 
* @param string $key 
* @return Response 
* @throws HttpException 
*/ 
public function putHomeAction(Request $request, $key) 
{ 
    // check that the home exists 
    $home = $this->getRepository()->findOneBy(array('key' => (int) $key)); 

    // disallow create via PUT as we want to generate key ourselves 
    if (!$home) { 
     throw new HttpException(403, 'Home key: '.$key." doesn't exist, to create use POST /homes"); 
    } 

    // create object graph from JSON string 
    $updatedHome = $this->get('serializer')->deserialize(
     $request->getContent(), 'Acme\ApiBundle\Document\Home', 'json' 
    ); 

    // replace existing Home with new data 
    $dm = $this->get('doctrine.odm.mongodb.document_manager'); 
    $home = $dm->merge($updatedHome); 
    $dm->flush(); 

    $view = View::create() 
     ->setStatusCode(200) 
     ->setData($home); 

    $response = $this->get('fos_rest.view_handler')->handle($view); 
    $response->setETag(md5($response->getContent())); 
    $response->setLastModified($home->getUpdated()); 

    return $response; 
} 

조치에 전달 된 JSON 문자열이 성공적으로 JMSSerializer하여 내 문서 객체 그래프 직렬화 복원되고,하지만 난 병합 & 플러시를 시도 할 때, 다음과 같은 에러가 발생합니다

여기 설명서를 따라하려고 시도했습니다
Notice: Undefined index: in ..../vendor/doctrine/mongodb-odm/lib/Doctrine/ODM/MongoDB/Mapping/ClassMetadataInfo.php line 1265 

: http://docs.doctrine-project.org/projects/doctrine-mongodb-odm/en/latest/reference/working-with-objects.html#merging-documents

이 s입니다 병합을 시도하기 전에 탈상화 된 집에해야 할 일이 있습니까? 잘못된 방법을 병합합니까?

감사합니다.

답변

1

내가 찾은 유일한 방법은 업데이트 된 문서 (예 : $updatedHome)를 매개 변수로 사용하는 기존 문서 (예 : $home)에 필요한 필드를 복사하는 메서드를 문서 클래스에 만드는 것입니다.

그래서 위의 코드 :

// replace existing Home with new data 
$dm = $this->get('doctrine.odm.mongodb.document_manager'); 
$home = $dm->merge($updatedHome); 
$dm->flush(); 

는 교체 할 수 있습니다 :

// replace existing Home with new data 
$home->copyFromSibling($updatedHome); 
$this->getDocumentManager()->flush(); 

후 작동합니다.