簡體   English   中英

具有學說的Symfony2用戶

[英]Symfony2 users with doctrine

我正在尋找獲取用戶創建內容的最佳實踐。 我有$ user對象形式'security.context',我需要通過一些$ record_id獲得該用戶創建的單個記錄,

那我該怎么辦?

$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)

在任何情況下,你必須指定user ,你傳遞給你的函數,如指定其處理的定制倉庫里取邏輯官方文檔的學說。

當然你必須傳遞用戶的id為“WHERE”sql子句,只是因為ROR在幕后神奇地做了它(這是一個非常糟糕的做法imo),並不意味着它根本沒有做到。

至於其他問題,兩種解決方案都可以:

  1. 從特定存儲庫中獲取數據,並傳遞對象ID +用戶的ID,或者:
  2. 創建內部獲取用戶id並將其置於查詢中的方法

並且請記住,在請求期間僅提取用戶的id 一次 ,因此不必擔心從安全上下文中獲取它太多。

您需要實現Symfony 2 ACL功能。 這允許您指定“域對象”(DB類的各個實例)的所有權以及用戶對域對象具有哪種訪問權限。 然后,您可以使用例如JMSSecurityExtraBundle並基於對象所有權實現訪問控制。 一旦實現,您的用戶將無法修改彼此的對象(通過參數操作),您將不需要查詢中的其他參數。

以下是一些相關鏈接:

  1. 訪問控制列表(ACL)
  2. JMSSecurityExtraBundle

就個人而言,我發現存儲庫類在中小型應用程序中有點膨脹。 不確定你的方法是什么,但我讀過的大多數內容(以及我在最近的Doctrine 2應用程序中發布的內容)都是有一個操作實體的“服務”層。 這是D2中的b / c,在實體中實現保存/刪除等會破壞系統的目的,即減輕實體持久性的知識並將它們視為Plain Old Php Objects(TM);)

對我的查詢看起來很奇怪的事情是傳遞主鍵ID和用戶ID來獲取用戶。 在我看來,像用戶表的pk將是用戶ID,或者至少如果用戶ID不是pk(不知道為什么會這樣)你應該能夠獲得記錄w /只是峰。 這是在我的系統中獲取User對象的方法

/**
 * @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”調用將返回與從數據庫中提取相同的User對象。 在會話中存儲User對象可以防止在每次加載頁面時返回數據庫,例如,如果您只是在會話中存儲了User id。

在一天結束時,您“應該”將復雜的選擇查詢放入存儲庫,但這顯然留給了用戶自行決定最佳實踐。 在這種情況下,當你只有一個pk時,我會說編寫一個存儲庫類是沒有意義的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM