2011-12-19 37 views
4

我正在尋找獲取用戶創建的內容的最佳做法。 我有$用戶對象的形式「security.context」,我需要得到這個用戶的一些$ RECORD_ID創造了一個記錄,Symfony2用戶與教條

所以我應該怎麼辦?

$this->getDoctrine()->getRepository('AcmeRecordBundle:Record') 
->findOneBy(array('id' => $record_id, 'user' => $user->getId())); 

這看起來對我好,因爲我有一個需要提取數據,查找用戶信息也很多的(爲了不讓其他用戶試圖通過一些ID得到它)。對於任何內容(個人照片,一些其他私人內容),我必須通過'user'=> $ user-> getId()?

或者最好用所有這些功能創建UserRepository? getRecordById($ ID),getPhotoById($ ID),getPrivateInformationById($ ID)等

我用Rails的一點工作,在那裏我能確定CURRENT_USER方法

def current_user 
    return @current_user if defined?(@current_user) 
    # .... 
end 

,然後只是用它作爲

current_account.records.find(params[:id]) 

是否有任何可能使它像Doctrine2和Symfony2這樣工作?像

$user->getRecords()->find($recordId) 

回答

0

當然,你必須通過用戶的ID爲「WHERE」 SQL子句,只是因爲ROR做到了神奇幕後(這是一個非常不好的做法IMO),但這並不意味着它沒一點都不做。

至於其他的事,這兩種解決方案都ok:

  1. 從特定的存儲庫中取出數據,並通過對象ID +用戶的ID,或:
  2. 創建它的內部獲得用戶的ID的方法並把它們在查詢

請記住,用戶的id是請求中提取一次,所以不用擔心會從安全上下文太多。

+0

所以你們建議的解決方案都是一樣的我在想 - 每次都要傳遞$ user-> getId(),或者爲每個選擇在一些UserRepository中創建單獨的方法? – 2011-12-22 12:53:10

+0

在存儲庫中的單獨方法中,您仍然必須將用戶的ID傳遞給查詢。它不可能做其他事情 – Itako 2011-12-27 13:31:15

1

在任何情況下,您必須指定user,您將其傳遞給您的函數,該函數用於處理Doctrine的official documentation中指定的定製存儲庫內的提取邏輯。

+0

雖然不像我希望的那樣優雅,但由於實體實際上並不知道數據庫的任何內容,因此定製存儲庫是最佳選擇。 – 2011-12-27 16:45:35

0

您需要實現Symfony 2 ACL功能。這使您可以指定「域對象」(數據庫類的單個實例)的所有權以及用戶對域對象的訪問類型。然後,您可以使用例如JMSSecurityExtraBundle並根據對象所有權實施訪問控制。一旦實現,用戶將無法修改彼此的對象(通過參數操作),並且在查詢中不需要額外的參數。

下面是一些相關鏈接:

  1. Access Control Lists (ACLs)
  2. JMSSecurityExtraBundle
0

個人而言,我發現庫類臃腫事情有點在一個小到中等規模的應用。不知道你的方法是什麼,但是我讀過的大部分內容(以及最近Doctrine 2應用程序中的內容)都是有一個「服務」層來操縱實體。這是D2中的b/c,在實體中執行保存/刪除等操作會破壞系統的目的,這是爲了減輕來自實體的持久性知識並將它們視爲Plain Old Php Objects(TM);)

對我來說看起來很奇怪的事情是傳遞一個主鍵ID和一個用戶ID來獲取一個用戶。在我看來,像用戶表的PK是用戶ID,或者至少如果用戶ID不是PK(不知道爲什麼會這樣),你應該能夠獲得記錄W /只是峯。下面是在我的系統

/** 
* @param int $iId user id 
* 
* @return object 
*/ 
public function fetch($iId) 
{ 
    return $this->_oEm->find('AwesomeApp\Entity\User', $iId); 
} 

獲取用戶對象的功能,當前用戶的排序,你正在尋找應用程序應該與該會話的方法。在zf中,我創建了一個會話處理程序,將會話存儲的Doctrine User對象保留下來,然後在讀取會話時,將User對象重新附加到Entity Manager。你很可能想在sf中做類似的事情,然後'getCurrentUser'調用將返回與從數據庫中拉出相同的用戶對象。在會話中存儲用戶對象可防止在每次加載頁面時都返回數據庫,例如,如果您只將用戶標識存儲在會話中。

在一天結束時,您應該將複雜的選擇查詢放入存儲庫,但顯然,這對於最佳實踐而言由用戶自行決定。在這種情況下,當你只有一個pk時,我會說沒有必要編寫一個存儲庫類。