【问题标题】:How to save child entity with symfony 2 FosRestBundle and Angular Resource如何使用 symfony 2 FosRestBundle 和 Angular Resource 保存子实体
【发布时间】:2015-02-03 18:01:18
【问题描述】:

我在使用 FOSRestBundle 和 Angularjs 资源时遇到了一些问题。

在我的 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 Resource 获取数据,然后我得到这样的对象:

{
   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 },我无法保存新的城市 ID。

我能做到:

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

但它很丑,我很难在我的应用程序中管理,因为我有很多带有子实体的实体。

所以,我的问题是:有一种方法可以自动正确地重新映射数据?

非常感谢!

【问题讨论】:

    标签: angularjs symfony angularjs-resource


    【解决方案1】:

    我终于找到了解决办法!我可以使用 JMSSerializer 将我的 Json 反序列化为对象,如果在 JSON 中设置了 id,JMS Serializer 会自动正确加载实体和子实体。

    $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
    

    此解决方案完美运行。希望我能帮助别人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多