我正在使用带有Restangular库的AngularJS来处理用Symfony2 + JMS Serializer + FOS Rest Bundle编写的Rest Api。通过AngularJS发送到Symfony2的对象/表单的验证REST API
为了在用户实体执行CRUD操作第一,我得到特定用户显示:
var User = Restangular.one('users', $routeParams.userId);
User.get()
.then(function(response) {
$scope.user = response;
});
我收到这样的JSON响应:
{
id: 1,
firstName: "Howell",
lastName: "Weissnat",
job: {
id: 1
name: "Job Name"
}
}
然后我想修改job
场用户实体内部。乔布斯在Symfony 2后端基本上是独立的实体(更像是价值对象),与用户实体有ORM关系。
然后我通过AngularJS修改前端上的用户,例如从选择框中的可用选项中选择作业。的$scope.user
JSON表示将看起来像这样:
{
id: 1,
firstName: "Howell",
lastName: "Weissnat",
job: {
id: 2
name: "Job Second Name"
}
}
然后我就与Restangular PUT请求:
$scope.user.save();
不幸的是Symfony2的期望接收对象是这样的:
{
id: 1,
firstName: "Howell",
lastName: "Weissnat",
job: 2
}
凡job: 2
基本上指向工作实体的ID。
我成功地处理了这个问题,在后端的UserType
类中创建了ViewTransformer。这将基本上将收到的作业对象转换为具有ID值的标量整数。 symfony.com/doc/current/cookbook/form/data_transformers.html
$builder->get('job')->addViewTransformer
不过,我觉得这是不正确的做法和现在我想不出还有什么更好的主意的。将更复杂的对象发送到Symfony2 RESTful后端的最佳做法是什么?这只是一个简单的例子,但在我的应用job
User类中的字段也可以包含Job
实体的集合。
我们基本上做的是,反序列化使用JMS(使用Doctrine对象的构造函数,而不是JMS的)东西,将它并入doctrinemanager和冲洗..听起来太简单了,它是那么容易!和您也可以简单地使用验证器服务,在刷新之前实际验证您的实体 –