json - 验证通过 AngularJS 发送到 Symfony2 REST API 的对象/表单

标签 json angularjs rest symfony restangular

我使用带有 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 在前端修改 User,例如从选择框中的可用选项中选择 Job。 $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 字段也可以包含 Job 实体的集合。

最佳答案

这些是我们使用的东西:

$entity = $this->get('jms_serializer')->deserialize($request->getContent(), $entityName, 'json');
if (!$entity) {
     throw new ApiException(Codes::HTTP_NOT_FOUND, null, 'entity with that id not found');
}

$violations = $this->get('validator')->validate($entity, $validationGroups);

if (count($violations) > 0) {

     return $violations;
}


$this->getDoctrine()->getManager()->merge($entity);
$this->getDoctrine()->getManager()->flush();

在您的服务中:

services:
    jms_serializer.doctrine_object_constructor:
          class:        %jms_serializer.doctrine_object_constructor.class%
          public:       false
          arguments:    ["@doctrine", "@jms_serializer.unserialize_object_constructor"]

    jms_serializer.object_constructor:
      alias: jms_serializer.doctrine_object_constructor

基本上做的是确保 jms 从 doctrine 中获取实体,并将值应用于现有实体,而不是创建一个新实体,并将值应用于新实体(并可能以一些空字段)

关于json - 验证通过 AngularJS 发送到 Symfony2 REST API 的对象/表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33550211/

相关文章:

javascript - 使用 AngularJS 将输入值从 ng-repeat 插入数组

angularjs - AngularJs 指令中的问号

android - 未设置 HTTPUrlConnection 中的 HTTP POST 数据?

javascript - 为泳道中的每个节点添加 CSS 或样式(GOjs 库)

ios - WS Websocket 是否能够在 Swift 中发送或接收 json 对象?

python - 在 for 循环中自动更改索引

javascript - 如何使用 d3.js 从外部 json 文件读取特定属性?

unit-testing - AngularJS Controller 单元测试 - 注入(inject)服务

rest - 当位置参数不安全时在 REST 中获取

rest - 同时查询字符串和范围