【问题标题】:Deserialize entity with null id and doctrine constructor反序列化具有空 id 和教义构造函数的实体
【发布时间】:2018-03-09 09:42:18
【问题描述】:

当我收到一个要反序列化且 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 字段时,它会尝试通过学说从数据库中检索具有该 id 的实体(类似于$repository->find($id))。

如果 Id 存在,则检索填充的实体。如果不存在则返回异常。问题是当我收到一个带有实体要持久化的 JSON 时,id 字段为空,它会尝试在数据库中查找带有ì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 块来捕获并使用自定义类记录异常。

希望你能帮助我,

谢谢

【问题讨论】:

  • 你能在它发生的地方添加控制器吗?当您在控制器中反序列化请求时会发生这种情况吗?
  • @AntoineGalluet 当我在上面写的控制器中反序列化请求时会发生这种情况

标签: php json symfony doctrine-orm jmsserializerbundle


【解决方案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;
}

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

【讨论】:

  • 在我看来,完整的 REST API 不需要构建表单或其他样板代码来序列化/反序列化 JSON,至少这是我在 Java 或 C# 中使用的方式。
猜你喜欢
  • 2013-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-05
  • 1970-01-01
  • 2016-12-31
  • 1970-01-01
  • 2016-07-13
相关资源
最近更新 更多