Слияние Doctrine Mongo ODM для внешне измененных данных

Я пишу приложение Symfony2, которое позволяет мобильным пользователям создавать и обновлять «Дома» через службу REST. Я использую MongoDB в качестве уровня хранения и ODM Doctrine MongoDB для обработки документов.

Методы 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#слияниедокументов

Есть ли что-то, что мне нужно сделать с десериализованным домом, прежде чем пытаться его объединить? Является ли слияние неправильным методом?

Спасибо.


person Phil Moorhouse    schedule 06.07.2012    source источник


Ответы (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();

и тогда это сработает.

person Phil Moorhouse    schedule 03.10.2012