Symfony采用JSON数据和填充实体的推荐方法是什么?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Symfony采用JSON数据和填充实体的推荐方法是什么?相关的知识,希望对你有一定的参考价值。

如果我在请求中接收JSON数据(比如API类型接口),那么Symfony建议填充实体的方式是什么。在我看来,选项是:

  • 使用表单组件 - 将解码后的JSON作为数组传递给submit()方法。
  • 使用序列化程序进行反序列化。

在我看来,使用序列化程序的问题是你需要手动进行数据转换(和验证,虽然简单)。

使用表单组件会感觉有点hacky,并且还使用了许多未触及/需要的功能。

是否有其他选项(内置于Symfony或其他捆绑包/包中)?或者是推荐的方式之一?

(我意识到这至少部分是基于意见的问题...)

答案

正如你所提到的 - 这是一个很容易解决的问题。您一直在考虑的选项是处理它的两种常用方法:

  1. 只需使用Form组件 - 需要创建一个FormType,增加一些性能开销(在大多数情况下并不重要)。作为奖励 - 它为您提供所有表格特权,例如不允许额外字段,使用表格事件等的能力。
  2. 使用Serializer + Validator - 在使用的​​组件方面是一个“瘦”选项,更冗长一点,没有表格特权

我要说使用表单一次性处理反序列化和验证确实没有错。

看看下面的示例操作代码。请注意,它使用FOSRestBundle View类来处理响应。它只接受一个json编码的实体数据,并根据它创建一个新实体或更新现有实体。

 public function sampleAction(SampleEntity $sampleEntity, Request $request) {

    //Is it a new or existing entity?
    $statusCode = $sampleEntity->getId() ? 200 : 201;

    //Load our form with the entity provided by the route loader
    $form = $this->createForm(SampleEntityType::class, $sampleEntity);

    //Decode the actual input and make Form component to populate an entity for us
    $formData = json_decode($request->getContent(), true);
    $form->submit($formData);

    //Validation is as simple as this
    if ($form->isValid()) {
        $em = $this->getDoctrine()->getManager();
        $em->persist($sampleEntity);
        $em->flush();
        return View::create($form, $statusCode);
    }

    return View::create($form->getErrors(true, false), 400);
}

以上是关于Symfony采用JSON数据和填充实体的推荐方法是什么?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Symfony2 中将 Json 绑定到实体中

Symfony2 - 具有关系的实体作为 json 响应

动态表单(切换实体)symfony2

Symfony,FOS 用户:使用空输入密码编辑用户

在 Symfony 中将 JSON 转换为 Doctrine 实体

Symfony 序列化器:将 Json 反序列化为实体