2012-10-13 71 views
2

我希望讓實體記錄最近修改實體的用戶(最好是他的ID)。我認爲一個漂亮的實體有一個getModifier()方法,但沒有setModifier(),因爲它是由類作爲內部事務處理的。我會用一些prePersist用用戶ID更新實體。所以這裏有兩個主要問題:如何將修飾符用戶存儲在Symfony 2實體中

1)從技術上講,我怎麼能得到一個實體的prePersist中的當前用戶ID?

2)哲學。我找到了很多答案,建議我重新思考我的模型,不要依賴於存儲在其中的任何數據。我沒有看到來自世界其他地方的孤立實體是如何理智的:在這裏看到兩個對比,在這些對比中允許實體做什麼。訪問服務以獲取可以存儲某些緩存輸出的文件夾名稱被認爲是非法的;而用文件抽象類寫入文件系統是可以的;我認爲後者對文件系統做了更多的假設。訪問當前用戶的身份被認爲是非法的;同時在實體上放置當前時間戳是可以的;所以一個(可能丟失的)用戶的概念是壞的,而時間概念是好的?如果關於不依賴於模型本身以外的任何其他概念是有效的,那麼人們如何敢於使用DateTime函數? (請不要說PHP的服務總是可訪問的,因爲一些缺失的設置/擴展可能很容易導致這些失敗。)我沒有看到如何在遵守嚴格限制的情況下將任何邏輯構建到實體中,以及如何避免那些實體最終只能是數據(通過這種封裝和信息隱藏級別,這個實體模型不會僅僅提供數組)。任何人都可以指出,模型環境中不能使用的那些元素與那些被認爲是合法的元素之間的特定區別是什麼?

回答

2

讓我拆我的答案分爲兩個部分:

關於1)

你不能。這對學說來說很難實現。儘管您在2)中的問題將在下面討論,但我們可以這樣說:共同的理解是,模型不知道有關服務的東西,但服務使用它們使其可重用。

爲什麼不結合制定者和添加$用戶屬性組合的二傳手,設置修改如下:

public function setAttributes($user, $attr1, $attr2) 
{ 
    $this->modifier = $user; 
    $this->attr1 = $attr1; 
    $this->attr2 = $attr2; 
} 

當然,你也可以將用戶添加到每個二傳手。

而且,當然還有其他方法。你可以例如添加一個不持久的屬性activeUser並在prePersist上使用這個或者如果沒有設置拋出異常。

關於2)

首先,我們承認有兩個思想流派。一個是模型可以擁有業務邏輯並可以使用其他類,但不應該依賴於更大的圖片,這意味着他們不應該從調用者那裏獲得複雜的對象。另一個(我在這裏)是模型應該是轉儲數據存儲,根本不應該包含業務邏輯。

兩者都認爲模型應該更多或更少愚蠢。如果你看看活動記錄(由symfony 1和RoR使用),你會看到另一個模型的概念,他們知道他們的上下文,例如必須知道數據庫。雖然這樣做有一些優點(比如你可以從內部保存一個模型,或者你可以讓它意識到哪個用戶正在對它進行操作),但是你也有很大的缺點(比如模型依賴於一個好的上下文,使得它很難遷移它甚至測試)。

學說不使用活動記錄,所以你將不得不忍受這個或多或少的「轉儲對象」,或將ORM與使用活動記錄概念的ORM交換(如Redbeanphp)。

+0

謝謝,我明白了你的觀點。 –

+0

該解決方案將實現使用容器獲取當前用戶的Doctrine行爲。我不想和愚蠢的實體一起去。我需要能夠安全地將我的實體傳遞給客戶端代碼,並假設通過OOP可以使這些類「自我照顧」,並且它們的接口已經足夠,並且不超過操縱它們所代表的數據所需的內容。對於簡單的學說實體來說這是不可能的,如果沒有這種行爲,我也可以用數組來代替。 :( –