2016-03-05 86 views
2

我目前正在使用Symfony框架构建一个API。我已经做了足够的阅读来了解如何使用序列化组件,并为我的实体构建了一些自定义标准化器。目前,它的工作方式是:在Symfony中将JSON转换为Doctrine实体

JSON - >阵列(解码) - >用户实体(非规范化)

这是努力的过程,只要请求内容是用户,例如JSON表示:

{ 
    "email": "[email protected]", 
    "plainPassword": "demouser", 
    "first_name" : "Demo", 
    "last_name" : "User" 
} 

甲用户实体在我的控制器使用下面的代码创建的:

$newuser = $this->get('api.serializer.default')->deserialize($request->getContent(), WebsiteUser::class, 'json'); 

然而,我想窝用户JSON以JSON的“数据”属性对象,这将让消费者通过额外的元数据与请求,例如:

{ 
    "options": [ 
    { 
     "foo": "bar" 
    } 
    ], 
    "data": [ 
    { 
     "email": "[email protected]", 
     "plainPassword": "demouser", 
     "first_name": "Demo", 
     "last_name": "User" 
    } 
    ] 
} 

的主要问题这将导致的是,反序列化并不成功,因为JSON格式已更改。

我到目前为止考虑的唯一解决方案是对整个请求体进行json_decode,获取该数组的'data'元素,并将数据元素的内容传递给denormalizer(而不是解串器)。

有没有更好的方法来解决这个问题?

回答

0

你应该能够得到您的请求主体的特定按键类似如下:

$newuser = $this->get('api.serializer.default')->deserialize(
    $request->request->get('data'), WebsiteUser::class, 'json' 
); 

如果你无法检索关键数据,而你的请求主体进行解码,看this bundle,它由只有一个EventListener在解码后替换请求主体。

您可以轻松地将相同的逻辑集成到您的应用程序中,或者直接要求捆绑包(它工作正常)。

相关问题