Как сохранить дочернюю сущность с помощью Symfony 2 FosRestBundle и Angular Resource

У меня проблемы с FOSRestBundle и Angularjs Resource.

В моем приложении Symfony у меня есть два объекта:

class Museum
{

    private $id;
    private $name;

    /**
    * @ORM\ManyToOne(targetEntity="EV\CityBundle\Entity\City")
    */
    private $city;


     // ... Getter and Setteer
  }




class City
{

    private $id;
    private $name;

    // ... Getter and Setteer
}

И у меня есть одна форма с:

$builder->add('name');

$builder->add('price');


$builder->add('city', 'entity', array(
            'class' => 'EVCityBundle:City',
            'property' => 'name');

Итак, моя форма ждет чего-то вроде этого:

array(
    name => "Museum of science",
    price => "4",
    city => 1234
);

И это очень хорошо работает в моем приложении Symfony.

Я использую JMSSerializerBundle для настройки того, какие данные я хочу отображать в своем API.

Итак, в моем приложении Angular я получаю свои данные с помощью ресурса Angularjs и получаю такой объект:

{
   name: "Museum of science",
   price: "4",
   city: { "id" : 1234, "name": "France" }
}

И когда я хочу сохранить его, я использую:

museum.name = "Museum of Super science";
museum.city.id = 1337;
museum.city.name = "Lyon"; 
museum.$save()

И данные, отправляемые по запросу POST:

{
   name: "Museum of science edited",
   price: "5",
   city: { "id" : 1337, "name": "Lyon" }
}

Но поскольку моя форма ожидает {city: id}, я не могу сохранить новый идентификатор города.

Я могу сделать это:

$request->request->set('city', $request->request->get('city')[id]); 

но это уродливо, и мне будет трудно управлять в моем приложении, потому что у меня много объектов с подобъектами.

Итак, мой вопрос: есть ли способ автоматически правильно переназначить данные?

Большое спасибо !


person user4520510    schedule 02.02.2015    source источник


Ответы (1)


Наконец-то я нашел решение! Я могу использовать JMSSerializer для десериализации моего Json в объект, и JMS Serializer автоматически загружает правильно объект и подобъект, если идентификатор установлен в JSON.

$data = json_encode($request->request->all());
$serializer = $this->container->get('jms_serializer');
$activity = $serializer->deserialize($data, 'EV\MyBundle\Entity\Museum', 'json');

Но вы должны добавить это в свой config.yml:

services:
    jms_serializer.object_constructor:
        alias: jms_serializer.doctrine_object_constructor
        public: false

Это решение работает отлично. Надеюсь кому-нибудь помогу.

person user4520510    schedule 03.02.2015