如果我在请求中接收JSON数据(比如API类型接口),那么Symfony建议填充实体的方式是什么。在我看来,选项是:
submit()
方法。在我看来,使用序列化程序的问题是你需要手动进行数据转换(和验证,虽然简单)。
使用表单组件会感觉有点hacky,并且还使用了许多未触及/需要的功能。
是否有其他选项(内置于Symfony或其他捆绑包/包中)?或者是推荐的方式之一?
(我意识到这至少部分是基于意见的问题...)
正如你所提到的 - 这是一个很容易解决的问题。您一直在考虑的选项是处理它的两种常用方法:
Form
组件 - 需要创建一个FormType,增加一些性能开销(在大多数情况下并不重要)。作为奖励 - 它为您提供所有表格特权,例如不允许额外字段,使用表格事件等的能力。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);
}