你的問題充滿了子問題,所以,首先我會試着弄清楚一些事情。
首先,您使用的命名規則有點兒缺乏,這對我以及其他人將來可能在您的代碼中工作(也許您會成長並需要僱用更多開發人員!: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
(另外,如果我prefere稱他們爲PersistenceManager
和SyntaxManager
,因爲在我的代碼,我總是管理者和處理器之間的區別 - 但是這是我的一個慣例,所以我不會在這裏寫更多關於它的信息)。
現在,我正在成像的另一個錯誤的事情是你正在做的事情(只讀你的問題,我想象中!):您正在從PersistenceService
(您目前命名爲PersistenceClass
)實例化SyntaxService
(您目前名爲SyntaxClass
)。這是錯誤的。
如果你需要的SyntaxService
一個新的實例爲每一個職位,那麼你應該使用一個工廠類(比如SyntaxFactory
),因此調用SyntaxFactory::create()
你會得到SyntaxService
一個新的實例。工廠本身是否注入了新創建的SyntaxClass
中的實體經理。
如果你不需要每一個新的實例,時間,相反,你會聲明SyntaxClass
僅僅作爲一種服務,並通過注射將它傳遞給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"]
但更大的問題是,如何我可以訪問只有堅持,但不 從PersistenceClass刷新實體?
現在第二個問題:如何搜索{persisted + flushed}和{persisted + not flushed} entities?
問題是你不能使用ID作爲搜索參數,因爲持久但未刷新的實體在刷新前沒有。
解決方案可能是創建另一個服務:SearchReferencesService
。在它中你也會注入實體管理器(如前所示)。
所以這個類有一個方法search()
做搜索。
要搜索的實體仍然存在,但不興奮,UnitOfWork
給你一些有趣的方法:getScheduledEntityInsertions()
,getScheduledEntityUpdates()
,getScheduledEntityDeletions()
,getScheduledCollectionDeletions()
和getScheduledCollectionUpdates()
。
你正在談論的數組已經存在:你只需要循環它並逐個比較一個對象,並在除了ID之外的字段上進行搜索(因爲它還不存在)。
不幸的是,由於您沒有提供有關搜索性質的更多詳細信息,因此我無法更準確地瞭解如何執行此搜索,但僅告訴您必須使用如果null
結果由第一個搜索返回,則工作並連接到數據庫。此外,您將執行此搜索的順序(之前在數據庫中,然後在工作單位或反之亦然)由您決定。
希望這會有所幫助。
你可以看到哪些實體仍然存在,但不會刷新尚未看的UnitOfWork'的EntityManager#getUnitOfWork()'(從[文件](http://docs.doctrine-project.org/projects/doctrine-orm/en /latest/reference/working-with-objects.html#direct-access-to-a-unit-of-work)) – lolmx