![](/img/trans.png)
[英]Symfony2 and Doctrine: proxy class does not lazy load entity fields
[英]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
是普通的数据库实体,则只需在Box
和Content
之间建立一对一关系,即可将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.