2012-01-04 15 views
8

Bir API oluşturmak için Symfony2'yi kullanıyoruz. Bir kaydı güncellerken, JSON girdisinin serileştirilmiş bir güncel varlığı temsil etmesini bekleriz. JSON verisi bazı alanları içermeyecektir (örneğin, CreateAt öğesinin oluşturulduğunda yalnızca bir kez ayarlanmalı ve hiçbir zaman güncellenmemelidir).Serileştirilmiş bir JSON'dan bir Doküman Varlığı nasıl güncellenir?

$supplier = $serializer->deserialize(
    $this->get('request')->getContent(), 
    'WhateverEntity', 
    'json' 
); 
: Burada
{"id":"1","name":"anyname","description":"anydescription"} 

yukarıdaki JSON göre varlık güncelleştirmek gerekir Denetleyicisindeki PHP kodu (biz JMS sıralandırıcı Paketi kullanıyorsanız) 'dir: Örneğin, burada bir örnek JSON PUT isteğidir

EntityManger, bunun bir güncelleme isteği olduğunu (doğru olarak) anlar (aslında SELECT sorgusu örtülü olarak tetiklenir). EntityManager ayrıca, CreatedAt özelliğinin NULLified olması gerektiğini (doğru olarak değil) tahmin eder - bunun yerine bir öncekini tutması gerekir.

Bu sorun nasıl giderilir?

cevap

8

Varlığınızdaki mevcut alanları bulmak için Doctrine\ORM\Mapping\ClassMetadata API kullanırım. Sen (ben JMSSerializerBundle nasıl çalıştığını bilmiyorum) Aşağıdaki yapabilirsiniz: http://jmsyst.com/bundles/JMSSerializerBundle

de yüklemek talimatları uygulayın ya kendi seri hale servisini oluşturmak veya kullanmak için JMSSerializerBundle değiştirmek

//Unserialize data into $data 
$metadata = $em->getMetadataFactory()->getMetadataFor($FQCN); 
$id = array(); 
foreach ($metadata->getIdentifierFieldNames() as $identifier) { 
    if (!isset($data[$identifier])) { 
     throw new InvalidArgumentException('Missing identifier'); 
    } 
    $id[$identifier] = $data[$identifier]; 
    unset($data[$identifier]); 
} 
$entity = $em->find($metadata->getName(), $id); 
foreach ($metadata->getFieldNames() as $field) { 
    //add necessary checks about field read/write operation feasibility here 
    if (isset($data[$field])) { 
     //careful! setters are not being called! Inflection is up to you if you need it! 
     $metadata->setFieldValue($entity, $field, $data[$field]); 
    } 
} 
$em->flush(); 
14

JMSSerializerBundle kullanarak Basit nesne yapıcısı yerine doktrin nesne oluşturucu.

<service id="jms_serializer.object_constructor" alias="jms_serializer.doctrine_object_constructor" public="false"/> 

Bu temelde Ocramius çözüm yapar ama JMSSerializerBundles serisini kullanarak tam olarak ne işler.

İlgili konular