Serialization Symfony2将XML数据反规范化为具有关系的实体

Serialization Symfony2将XML数据反规范化为具有关系的实体,serialization,symfony,doctrine-orm,denormalization,Serialization,Symfony,Doctrine Orm,Denormalization,我正在使用Symfony2和Doctrine 2.0。我试图从XML提要读取数据,并将其映射到数据库中的新实体或现有实体。当XML提要中的数据发生更改时,我需要更新现有实体,但当添加数据时,我应该创建新实体 在我的实体类中,我使用以下非规范化方法将XML数据映射到实体的属性: function denormalize(SerializerInterface $serializer, $data, $format = null) (在我的实体类内调用的Symfony\Component\Ser

我正在使用Symfony2和Doctrine 2.0。我试图从XML提要读取数据,并将其映射到数据库中的新实体或现有实体。当XML提要中的数据发生更改时,我需要更新现有实体,但当添加数据时,我应该创建新实体

在我的实体类中,我使用以下非规范化方法将XML数据映射到实体的属性:

function denormalize(SerializerInterface $serializer, $data, $format = null) 
(在我的实体类内调用的Symfony\Component\Serializer\Serializer中定义)

这个方法的文档声明“重要的是要理解denormalize()调用应该递归地去规范化实现器的所有子对象。”这就是我要做的。但是,实体不应该知道EntityManager,那么如何在denormalize()方法中检查相关/子实体是否已经存在

亲切问候,,
Matthew

在实体中(据我所知,在控制器外部)调用EntityManager确实是个坏主意

我从来没有遇到过这个问题,但是如果我是你,我会尝试在你的一个控制器中去规范化,或者如果它真的困扰你,在一个你调用控制器并将你的EntityManager交给你的服务中去规范化(在这里,最好还是在控制器本身中去做,或者简单地将你的对象发送到服务中,这样它就可以将xml去规范化为对象)

最好是编写一个无论给定实体如何都能工作的控制器


希望有帮助

我认为我的问题在于我的方法,而不是我的代码

最初,每次我发现XML中表示的实体时,我都会检查(使用EntityManager),看看它是新的还是现有的,然后再对其进行非规范化。我采用这种方法是因为XML中存在重复,我担心在EntityManager中创建重复的实体。检查实体是否已经存在意味着我可以更新现有实体,而不是创建一个副本。现在,使用我的新方法,每当我找到XML中表示的实体时,我都将其反规范化为一个新实体。当然,这会在EntityManager中创建重复,就像在XML中一样,但这可以在以后处理,希望如此

到目前为止,这是一个更好的解决方案,尽管我在尝试使用$em->merge()在EntityManager中合并重复实体时遇到了一些问题;和cascade={“persist”,“merge”}。我在这里发布了一个新问题:


Matthew

谢谢Gabriel,实际上我正在对控制台命令中的实体进行非规范化,但我想在这种情况下,命令或控制器并没有太大的区别。我想问题其实是我想做的太多太快了,现在我决定采取一种新的方法。我将在下面更详细地解释。请让我知道你的想法:)