在Symfony中仅发送REST API中必填字段的最佳实践

时间:2018-07-03 07:14:17

标签: symfony fosrestbundle sylius

我们需要使用REST API将证书列表发送到另一个应用程序。因此对象响应包含

[
   {
      "id":1,
      "orderId":123,
      "certificateStatus":true,
      "certificateNo":"xyz123abc",
      "customer":{
         "id":36,
         "email":"abc@cc.com",
         "firstName":"abc",
         "lastName":"dfg",
         "user":{
            "id":23,
            "username":"abc@cc.com",
            "enabled":true,
            "kycStatus":false
         },
         "_links":{
            "self":{
               "href":"\/app_dev.php\/api\/v1\/customers\/36"
            }
         }
      },
      "orderItem":{
         "id":60,
         "quantity":2,
         "unitPrice":177581,
         "total":355162,
         "units":[
            {
               "id":1711,
               "adjustments":[

               ],
               "adjustmentsTotal":0
            },
            {
               "id":1712,
               "adjustments":[

               ],
               "adjustmentsTotal":0
            }
         ],
         "unitsTotal":355162,
         "adjustments":[

         ],
         "adjustmentsTotal":0,
         "variant":{
            "id":334,
            "code":"pool-gold-1oz",
            "optionValues":[

            ],
            "position":0,
            "translations":{
               "en_US":{
                  "locale":"en_US",
                  "id":334
               }
            },
            "version":2,
            "tracked":false,
            "channelPricings":{
               "UK_WEB":{
                  "channelCode":"UK_WEB",
                  "price":177582
               },
               "US_WEB":{
                  "channelCode":"US_WEB",
                  "price":177581
               }
            },
            "_links":{
               "self":{
                  "href":"\/app_dev.php\/api\/v1\/products\/pool-gold-1oz\/variants\/pool-gold-1oz"
               }
            }
         },
         "_links":{
            "order":{
               "href":"\/app_dev.php\/api\/v1\/orders\/29"
            },
            "product":{
               "href":"\/app_dev.php\/api\/v1\/products\/pool-gold-1oz"
            },
            "variant":{
               "href":"\/app_dev.php\/api\/v1\/products\/pool-gold-1oz\/variants\/pool-gold-1oz"
            }
         }
      }
   }
]

我希望JSON响应类似于下面的示例响应  -需要额外的自定义字段  -状态码和消息  -额外的字段  -删除不需要的字段

    {
   "code":"custom_code_xxx",
   "message":"Successful",
   "data":[
      {
         "custom_extra_fields1":"asd",
         "custom_extra_fields2":"xyz",
         "id":1,
         "orderId":123,
         "certificateStatus":true,
         "certificateNo":"xyz123abc",
         "customer":{
            "id":36,
            "email":"abc@xyz.com",
            "firstName":"abc",
            "lastName":"dfg",
            "user":{
               "id":23,
               "username":"abc@xyz.com",
               "enabled":true,
               "kycStatus":false
            }
         },
         "orderItem":{
            "id":60,
            "quantity":2,
            "unitPrice":177581,
            "total":355162,
            "unitsTotal":355162
         }
      }
   ]
}

我们可以使用任何最佳实践来简化JSON响应吗?或者我们需要以所需的格式构造一个数组

2 个答案:

答案 0 :(得分:0)

当您使用类似JMS Serializer Bundle可以使用

Virtual Properties用于其他自定义字段。

然后用Groups和/或Exclusion Policies删除不需要的字段。

使用Symfony Serializer时,您至少可以选择Groups来排除某些字段。

要添加其他字段,我要么在实体中仅使用一个附加的Getter(没有干净的方法,但会有所帮助),或者使用自定义规范化器和/或编码器。

答案 1 :(得分:0)

斯特芬,

您应该创建一个新的数据传输对象,其中包含要用作响应的属性。然后将该对象作为json返回。

然后,您创建一个基于原始对象构建DTO的汇编程序类。