使用null id和doctrine构造函数

时间:2018-03-09 09:42:19

标签: php json symfony doctrine-orm jmsserializerbundle

当我收到一个使用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块捕获并使用自定义类记录异常。

我希望你能帮助我,

由于

1 个答案:

答案 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;
}

不知道它是否适合您的项目,但这是我所知道的最干净的方式,它绕过了您的问题,因为您不必将其放在您的表单中。