3

我对 Symfony2/Doctrine2 有建模问题。我目前正在尝试将整个网站从以前的 PHP 框架传递到 Symfony2,并且在以前的框架中有一个我喜欢但我无法用 Symfony 和 Doctrine 建模的概念。

这是我的问题:使用前一个框架,可以将 A 类的对象链接到任何其他类(B、C、D ...)的任何其他对象。为此,类 A 有一个属性 model_id 来知道该对象链接到哪个类(它对应于在配置文件中为每个类定义的唯一 id),以及一个属性 record_id,它是链接对象的外部 id . 这样,例如,可以有一个类 Comment 并对任何对象(博客文章、用户等)进行评论。

由于这些通用链接似乎无法用 Doctrine 关系(ManyToOne 等)进行建模,因此我考虑拥有 - 就像在前一个框架中一样 - 一种全局方法或每个类的方法,例如称为 getItem,它着眼于属性 model_id 和 record_id 然后返回正确的对象。

但我又遇到了问题:

  • 我不能直接在 Entity 中定义这个方法,因为我不应该访问 Entity 类中的数据库。

  • 如果我在全局服务中定义它一次,或者为存储库中的每个类定义 n 次 - 这是可能的,因为这次我可以访问数据库 - 我将能够在任何地方调用该方法,但在实体代码中。它使实现变得非常丑陋,因为这意味着在我之前的示例中,需要访问评论的所有实体方法都必须从实体移动到存储库。最后,我将在存储库中而不是直接在实体中拥有几乎所有的对象方法。

您对我如何拥有这样的系统有任何想法吗?它允许一般地将对象链接到任何其他对象,然后轻松恢复链接的对象,就像它是“通常的”教义关系一样?

非常感谢您的帮助。

4

2 回答 2

2

The thing is your solution means we know in advance that the object A is going to be linked to an object B, C, etc. However, what I wanted to implement is a solution where we don't know in advance what are going to be the links and we have the possibility to create a new link between the object A and an object of a newly created class Z without changing anything in the classes A and Z. This way, if I take my previous example, you can properly have a Comment on any Object, without making straight relationships between the class Comment and the other classes.

And I think I found the solution to this problem:

What I've done is implementing a Listener, with the event postLoad which triggers each time an entity is loaded from Doctrine. On the other hand, my entities have for example an attribute $item which is the linked item for which we don't know the class yet. In the postLoad event, we look in the database thanks to model_id and record_id what is the class of the linked item and return the object itself, and then we fill the $item attribute before the entity is returned by Doctrine. This way, each time we get an entity from Doctrine, the "fake" link between the entity and the item is built by the automatic event, and this works for every entity. With the same principle, we can update the link with a postUpdate event which triggers each time we update the entity. It will update manually the "fake" link in the database.

For more information, I recommend to read these pages :

于 2012-06-18T09:44:24.533 回答
0

我实现与此类似的方法相当简单,但并不完全直截了当:

您将创建一个新类,我将提出一个类似的名称:

评论主题注册表

在那里,您将链接到其他对象:

class_a_id
class_b_id
class_c_id

这使您可以将其与其他多个相关联。您一次只能使用一个远程 id,但它允许您跨对象使用它并利用 orm。

如果您不想太担心初始 object->comment_thread 设置,那么我建议您可能只是:

foreign_id
外国类

说得通?

于 2012-06-12T15:01:22.327 回答