我有一个类(PersistenceClass
),它接受一个数据数组(posts
)并解析该数据并将其放入数据库(通过学说)。字段content
需要在第二个类(SyntaxClass
)解析之后才能被设置到学说实体中。
现在的问题是,SyntaxClass
必须将内容中的引用设置为其他帖子(只是带有ID的链接)。因此它需要访问数据库,还需要在PersistenceClass
中搜索持久但尚未刷新的实体。
我可以将一个学说EM注入SyntaxClass
并在DB中找到我的参考文献,虽然我不太喜欢它。但更大的问题是,我如何才能访问PersistenceClass
中唯一的持久但未刷新的实体?我可以创建一个这些对象的数组,并将其作为参数提供给解析器方法,如:
SyntaxClass->parseSyntax($content, $persistedObjects);
但这看起来不太干净。除此之外,我不知道是否可以在某种程度上搜索持久化对象的数据?
答案 0 :(得分:1)
你的问题充满了子问题,所以,首先我会尝试清楚一些事情。
首先,您使用的命名约定有点过分,这对我和其他可能在将来处理您的代码的人没有帮助(也许您会成长,需要雇用更多的开发人员!:P)。所以,让我们从一些命名开始吧。
您所谓的PersistenceClass
可能是这样的:
class PersistenceClass
{
public function parse(array $posts)
{
foreach ($posts as $post) {
// 1. Parse $post
// 2. Parse content with SyntaxClass
// 3. Persist $post in the database
}
}
}
同样适用于SyntaxClass
:它接收$content
并以某种方式解析它,然后设置引用然后继续。
这只是为了设定一些界限。
现在,回答你的问题。
我可以将一个学说EM注入SyntaxClass并找到我的参考文献 DB,虽然我不太喜欢它。
这正是你要做的! OOP开发以这种方式工作。
但是,这里出现了命名约定的问题,注入实体管理器的方式取决于类的结构。
好的设计应该使用services。
因此,实际上PersistenceClass
和SyntaxClass
现在应该被称为PersistenceService
和SyntaxService
(如果我优先称它们为PersistenceManager
和{{ 1}},因为在我的代码中我总是区分管理器和处理程序 - 但这是我的惯例,所以我不会在这里写更多关于它的内容。)
现在,我正在做的另一个错误的事情就是你正在做的事情(只读你的问题,我想象!):你正在实例化SyntaxManager
(你当前命名为SyntaxService
)来自{ {1}}(您当前命名为SyntaxClass
)。这是错误的。
如果您需要为每个帖子提供PersistenceService
的新实例,那么您应该使用工厂类(例如PersistenceClass
),因此调用SyntaxService
您将获得一个新的实例SyntaxFactory
。工厂本身是否在新创建的SyntaxFactory::create()
中注入实体管理器。
如果您不需要每个新的实例,相反,您只需将SyntaxService
声明为服务,并通过注入将其传递给SyntaxClass
。在这个最后一个更简单的例子下面:
SyntaxClass
但更大的问题是,我如何才能访问唯一持久的,但是 不是来自PersistenceClass的刷新实体?
现在第二个问题:如何搜索{persisted + flushed}和{persisted + not flushed}实体?
问题是你不能使用ID作为搜索参数,因为持久但未刷新的实体在刷新之前没有。
解决方案可能是创建另一项服务:PersistenceService
。在其中,您也将注入实体管理器(如前所示)。
所以这个类有一个方法# app/config/service.yml
services:
app.service.persistence:
class: ...\PersistenceService
# Pass the SyntaxInstance directly or a factory if you need one
aguments: ["@doctrine.orm.default_entity_manager", "@app.service.syntax"]
app.service.syntax:
class: ...\SyntaxService
aguments: ["@doctrine.orm.default_entity_manager"]
来进行搜索。
要搜索持久但未刷新的实体,SearchReferencesService
会为您提供一些有趣的方法:search()
,UnitOfWork
,getScheduledEntityInsertions()
,getScheduledEntityUpdates()
和{ {1}}。
您正在谈论的数组已经存在:您只需要循环它并逐个比较,基于ID之外的字段进行搜索(因为它还不存在)。
不幸的是,由于您没有提供有关搜索性质的更多详细信息,因此我无法更准确地了解如何进行此搜索,但只告诉您必须使用工作单元进行搜索如果第一次搜索返回getScheduledEntityDeletions()
结果,则连接到数据库。此外,您执行此搜索的顺序(在数据库之前,然后在工作单元中或反之亦然)取决于您。
希望这会有所帮助。