繁体   English   中英

实体负载上的Symfony2原则更改值

[英]Symfony2 Doctrine Change Value on Entity Load

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

加载此文件时,我想将其加载到特定的Content对象(每种可能的JSON格式具有不同的Content子类)。

是否有任何事件或任何我可以关联的事件,以便我可以在构建实体之前就捕获值(因此,我可以使用setContent()类型提示Content类,而不必是通用类,而我必须这样做如果我在拦截之前将信息加载到Entity中,则执行该操作)。

有任何想法吗?


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

{
    body: "ABC",
    value: 5
}

转到这样的类的对象:

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

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


进一步澄清

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

在正常情况下,如果Content是普通的数据库实体,则只需在BoxContent之间建立一对一关系,即可将Content正确地加载到Box而无需执行任何特殊操作。

但是,在这种情况下, Content可以具有多种形式。 为了解决这个问题,它作为JSON对象存储在Box表的BLOB字段中。 这意味着当Doctrine尝试加载Box ,它将尝试加载字符串。

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

但是,我希望它在使用时始终是一个Content对象,因此我想对该函数进行类型提示(即Box::setContent(Content $content) )。 问题在于,这将阻止Doctrine向该字段提供字符串。

这就是为什么我要截获Doctrine的content值并将其加载到实体Box之前用适当的对象替换它。

我认为没有任何教义事件能够完全满足我的要求,因此可能实际上是不可能的。 = S

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

您可以使用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反序列化的嵌套实体的某些字段的实体?

最终,我要做的就是为每种可能的Content类型创建不同的表和实体,然后使用Doctrine的继承来让Doctrine处理它们。 不知道(因为可能有很多很多类型,这意味着更多的表,而且我不能只是动态地构造新类型),但目前效果很好。

教义继承

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM