使用空 ID 和原则构造函数反序列化实体



当我收到一个使用空 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 问题,因为您不必将其放入表单中。

最新更新