2016-11-30 42 views
0

我有一個類(PersistenceClass),它需要一組數據(posts)並解析該數據並將其放入數據庫(通過原則)。在將其設置爲原則實體之前,需要使用第二個類(SyntaxClass)對字段content進行解析。需要在類作用域之間切換

現在的問題是,SyntaxClass必須將內容中的引用設置爲其他帖子(只是與ID和ID的鏈接)。所以它需要訪問數據庫,並且還需要搜索來自PersistenceClass的持久但尚未刷新的實體。

我可以注入一個教條EM到SyntaxClass,並在DB中找到我的參考,儘管我不太喜歡它。但更大的問題是,我如何才能訪問PersistenceClass中唯一持久但未刷新的實體?我可以做一個陣列中的物體,並把它作爲參數傳遞給解析器方法,如:

SyntaxClass->parseSyntax($content, $persistedObjects); 

但是,這看起來不是很乾淨。除此之外,我不知道是否有可能在持久對象的數據中搜索?

+0

你可以看到哪些實體仍然存在,但不會刷新尚未看的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

回答

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

那麼,目前有哪些在現實PersistenceClassSyntaxClass應該叫PersistenceServiceSyntaxService(另外,如果我prefere稱他們爲PersistenceManagerSyntaxManager,因爲在我的代碼,我總是管理者和處理器之間的區別 - 但是這是我的一個慣例,所以我不會在這裏寫更多關於它的信息)。

現在,我正在成像的另一個錯誤的事情是你正在做的事情(只讀你的問題,我想象中!):您正在從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結果由第一個搜索返回,則工作並連接到數據庫。此外,您將執行此搜索的順序(之前在數據庫中,然後在工作單位或反之亦然)由您決定。

希望這會有所幫助。

+0

感謝長期答案:)首先:是的命名很簡單,因爲ambigous我只是做它在這裏提出了問題(我想打破真實系統的複雜性)。是的,課程是服務。不,我的意圖和目前的流程不是,語法類堅持數據。其實語法類僅是一個輔助和不提供只有一個公共職能('parseString')返回解析字符串。其實我不喜歡它連接到數據庫,但現在沒有其他方式,因爲參考。 – Asara

+1

,但構建參考搜索的新服務的想法可能是一個很好的想法,我會考慮重新考慮這一點。由於搜索引用會非常複雜,我想我會首先刷新所有帖子並以某種方式將它們標記爲「尚未語法化」 – Asara