当我收到一个使用null id反序列化的实体时,我遇到了很多问题。
我的JMS Serializer配置文件是:
jms_serializer:
handlers:
datetime:
default_format: Y-m-d\TH:i:s+
array_collection:
initialize_excluded: false
property_naming:
id: jms_serializer.identical_property_naming_strategy
separator: ''
lower_case: false
enable_cache: true
object_constructors:
doctrine:
fallback_strategy: "fallback"
因此,当实体具有id字段时,它会尝试通过doctrine(类似$repository->find($id)
)从数据库中检索具有该id的实体。
如果Id存在,它将检索填充的实体。如果不存在则返回异常。问题是,当我收到一个要持久化的实体的JSON时,id字段为null并且它尝试使用ìd==null
在数据库中查找实体,因此它会引发异常。
我试图将fallback_strategy
更改为:“null”,“exception”或“fallback”但没有成功。
protected function post(Request $request)
{
$content = $request->getContent();
try {
$entity = $this->get('jms_serializer')->deserialize($content, 'App\Entity\Service', 'json');
} catch (\Exception $e){
throw new ValidationException($e);
}
....
}
我使用try-catch块捕获并使用自定义类记录异常。
我希望你能帮助我,
由于
答案 0 :(得分:1)
它更像是一种解决方法,但对于我的CRUD控制器,我更喜欢使用表单来反序列化我的对象。它允许我更灵活,我可以为同一个实体提供不同形式的有效载荷,我可以更好地检查我的有效载荷。
常见表单看起来像这样(你必须使它适应你的实体)
class YourEntityType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name')
->add('description')
...
}
}
在控制器中:
protected function post(Request $request)
{
$yourEntity = new YourEntity();
$form = $this->createForm(YourEntityType::class, $yourEntity);
$form->submit($request->request->all());
if ($form->isSubmitted() && $form->isValid()) {
$em->persist($yourEntity);
$em->flush();
return $yourEntity;
}
return $form;
}
不知道它是否适合您的项目,但这是我所知道的最干净的方式,它绕过了您的问题,因为您不必将其放在您的表单中。