1

我有一个具有字段的数据库结构content。在数据库中这是 a BLOB(so a string)。content包含 JSON 编码的字符串。

当我加载它时,我想将它加载到一个特定的Content对象中(Content对于 JSON 的每种可能格式都有一个不同的子类)。

是否有任何事件或任何我可以连接的东西,以便我可以在构建实体之前立即捕获值(所以我可以对类进行setContent()类型提示Content而不是必须是通用的,如果信息我必须这样做在我拦截之前加载到实体中)。

有任何想法吗?


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

{
    body: "ABC",
    value: 5
}

转到这样的类的对象:

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

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


进一步澄清

基本上,我有一个名为Box. Box有一个content值,它应该是Content.

在正常情况下,如果是一个普通的数据库实体,我只需在andContent之间建立一对一的关系,它会正确加载到而不需要做任何特殊的事情。BoxContentContentBox

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

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

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

这就是为什么我想拦截 Doctrine 的值content并在将其加载到实体之前将其替换为适当的对象Box

我不认为任何 Doctrine 事件都完全符合我的要求,所以它可能真的不可能。=S

4

3 回答 3

0

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

于 2013-03-22T23:45:29.500 回答
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 -类型

您需要从数据库加载数据而不是创建实体吗?或者加载具有从 JSON 反序列化的嵌套实体的某些字段的实体?

于 2013-03-24T21:40:13.760 回答
0

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

教义传承

于 2013-04-04T00:24:52.457 回答