当我收到一个使用空 id 反序列化的实体时,我遇到了很多问题。
我的 JMS 序列化程序配置文件是:
jms_serializer:
handlers:
datetime:
default_format: Y-m-dTH: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 字段时,它会尝试通过原则(类似于 $repository->find($id)
(从数据库中检索具有该 id 的实体。
如果 ID 存在,它将检索填充的实体。如果不存在,则返回异常。问题是,当我收到带有要保留的实体的 JSON 时,id 字段为 null,并且它尝试在数据库中查找具有 ìd==null
的实体,因此它会引发异常。
我试图将fallback_strategy
更改为:"null","异常"或"回退",但没有成功。
编辑:发生位置的控制器
protected function post(Request $request)
{
$content = $request->getContent();
try {
$entity = $this->get('jms_serializer')->deserialize($content, 'AppEntityService', 'json');
} catch (Exception $e){
throw new ValidationException($e);
}
....
}
我放置了一个 try-catch 块来捕获并使用自定义类记录异常。
希望你能帮到我,
谢谢
这更像是一种解决方法,但对于我的 CRUD 控制器,我更喜欢使用 form 来反序列化我的对象。它使我更加灵活,我可以为同一实体使用不同形式的有效载荷,并且可以以更好的方式检查我的有效载荷。
常见形式如下所示(您必须使其适应您的实体(
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;
}
不知道它是否适合您的项目,但这是我所知道的最干净的方式,它会绕过您的 id 问题,因为您不必将其放入表单中。