2013-03-22 82 views
1

我有一个数据库结构,其中有一个字段content。在数据库中,这是一个BLOB(所以一个string)。 content包含一个JSON编码的字符串。Symfony2原则更改实体负载的值

当我加载这个,我想加载到一个特定的Content对象(不同的Content子类为JSON的每种可能的格式)。

是否有任何事件或任何东西,我可以连上,所以我可以赶上实体是内置前值(所以我可以有setContent()类型一丝Content类,而不必是通用的,我会如果信息在拦截前被加载到实体中,则必须执行此操作)。

任何想法?


更多的细节。基本上我想象的是有某种类的Factory类,它接受一个JSON字符串并将其转换为适当的对象。

{ 
    body: "ABC", 
    value: 5 
} 

去一个类的对象是这样的:

class MyContent extends Content 
{ 
    protected $body; 
    protected $value; 
} 

我不能用典型的对象映射,因为它是一个JSON字符串的对象。


进一步澄清

基本上,我有一个名为Box的实体。 Box的值为content,该值应该是Content的实例。

在正常情况下,如果Content是一个正常的数据库实体,我只想挂钩BoxContent之间的一对一的关系,这将在该Box正确加载Content,而无需做任何特殊。

但是,在这种情况下,Content可以有多种形式。要处理这个问题,它将作为一个JSON对象存储在Box的表中的BLOB字段中。这意味着当学说试图加载Box时,它会尝试加载一个字符串。

我可以简单地让Box::setContent()接受任何参数并根据它是否为字符串或Content对象来处理它。

然而,我想它,以便当它被用来它是总是一个Content对象,所以想要类型暗示为函数(即,Box::setContent(Content $content))。问题是这会阻止Doctrine向该字段提供字符串。

这就是为什么我想拦截content的原则所取的值,并在将其加载到实体Box之前用适当的对象替换它。

我不认为任何的教义事件都是我想要的,所以它可能不是真的。= S

+0

有一个(https://doctrine-orm.readthedocs.org/en/latest/reference/events.html?highlight=lifecycle#lifecycle-events)在可用[生命周期事件列表]文档。不确定哪一个可能会用于您的案例,可能需要更多信息 – 2013-03-22 23:45:19

+0

在实体类的构造函数中加载内容对象怎么样? – Sethunath 2013-03-23 06:31:48

回答

0

最终我最终做的只是为每个可能的Content类型创建不同的表和实体,然后使用Doctrine的继承来让Doctrine处理它们。不知道(因为可能有很多很多类型,这意味着更多的表,我不能动态地构造新类型),但它现在运行良好。

Doctrine Inheritence

0

您应该可以将代码添加到实体get方法来执行此操作。您还可以查看生命周期回调的教义:http://docs.doctrine-project.org/en/2.0.x/reference/events.html#lifecycle-callbacks

+0

我无法将它添加到get方法,因为那样我就不能使用函数type-hinting来只接受适当的对象,因为来自数据库的数据是一个字符串。 – samanime 2013-03-23 00:13:51

+0

你在哪里试图添加类型提示? – 2013-03-23 07:13:51

+0

到'Box :: setContent()'方法。看到我对这个问题的更新。 – samanime 2013-03-25 00:19:34

0

您可以使用JMSSerializer从JSON创建实体 - https://github.com/schmittjoh/JMSSerializerBundle

我`吨理解你的问题,但也许你可以使用json_array型 - http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/basic-mapping.html#doctrine-mapping-types

你需要从DB,比创建实体加载数据?或者加载一些实体嵌套实体从JSON反序列化的字段?

+0

我需要将数据库中的字符串转换为实体,然后才将其分配给实体。 – samanime 2013-03-25 00:20:24

+0

您可以使用http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/events.html#entity-listeners-class挂钩实体管理器生命周期,并使用JMSSeriazer反序列化内容字段并设置它。 – 2013-03-25 11:42:14

+0

哪一个呢?唯一看起来相关的是postLoad,但似乎在它已经尝试创建实体之后。在我的场景(带有类型提示的字段)中,这会引发错误。 – samanime 2013-03-25 17:40:59