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

问题描述 投票:0回答:1

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

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

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

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

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

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

symfony doctrine-orm symfony-forms
1个回答
1
投票

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

  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);
}
© www.soinside.com 2019 - 2024. All rights reserved.