【发布时间】:2016-02-06 14:54:44
【问题描述】:
我正在使用带有 Restangular 库的 AngularJS 来处理用 Symfony2 + JMS Serializer + FOS Rest Bundle 编写的 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 基本上是指向 Job Entity 的 ID。
我成功地解决了在后端的UserType 类中创建 ViewTransformer 的问题。这基本上会将接收到的作业对象转换为具有 ID 值的标量整数。
symfony.com/doc/current/cookbook/form/data_transformers.html
$builder->get('job')->addViewTransformer
但是我觉得这不是正确的方法,我现在想不出更好的主意。将更复杂的对象发送到 Symfony2 RESTful 后端的最佳实践是什么?这只是一个简单的例子,但在我的应用程序中,User 类中的job 字段也可以包含Job 实体的集合。
【问题讨论】:
-
我们基本上做的是,使用 jms 反序列化(使用教义对象构造函数,而不是 jms 的),将其合并到教义管理器中并刷新 .. 听起来太容易了,就这么简单!,你也可以简单地使用验证器服务,在刷新之前实际验证您的实体
标签: json angularjs rest symfony restangular