2014-09-01 33 views
0

我正在登錄系統上工作。我試圖避免重複代碼,並儘可能地分離責任。如何從我的邏輯中將查詢分離到數據庫 - 分離責任,基本上

讓我們假設我有一個Authentication類執行以下操作:

class Authentication 
{ 
    public function login($username, $password); 

    public function logout(); 

} 

下鄉樹遠一點,我到一個地步,我需要的用戶與在憑證輸入比較憑據數據庫。

總的來說,我可以抽象出一個特定的點,我需要對某些事物進行實際的唯一查詢。

例如,對於登錄功能我需要像查詢:

$dbPDO->prepare("SELECT $loginUsername, FROM $tableName WHERE $loginUsername=:username"); 

對於registrying用戶我需要像查詢:

$dbPDO->prepare("INSERT INTO $tableName($loginUsername, $loginPassword, $loginEmail) VALUES (:username, :password, :email)"); 

等等等等向前。

這是我的問題/關注,無論你想調用它。

一般來說,我建立一個只做某件事和某件事的類。我並不想將查詢與邏輯混合(可以這麼說)。

編寫一個只關注查詢的類(或別的東西,比如一個接口,我不知道)是不是一個好主意。或者,將查詢與邏輯混合在一起可以嗎?

我真的很希望我以一種可以理解的方式解釋我自己。

回答

1

一個非常常見的解決方案是存儲庫模式。基本上這個想法是,你儘可能接近儘可能地處理你的實體,就像他們從未寫入磁盤一樣,而是總是在內存中剩餘。

您的存儲庫有許多不同的方法用於根據標準(當大多數框架表示模型時,它們表示實體)查找和保溼您的實體。然後,您的存儲庫將實現查詢數據庫的所有邏輯,並在存儲庫返回的對象上設置必要的屬性。它也應該保溼相關的物體。許多ORM爲你做這個部分(水合)。這個例子是hibernate(Java)和doctrine2(php)。

基本上,你最好的選擇是要麼從後續查詢到對象的所有邏輯,並把它放入存儲庫類或使用orm爲你做這個。

在您的情況下,您的身份驗證類應該有一個用戶存儲庫,讓用戶使用給定的ID,然後他們將檢索到的用戶密碼與輸入的密碼進行比較。

+0

即使通過設置一個存儲庫(基於一個抽象類可能非常通用),我建議只從該存儲庫生成查詢,並將所有DML和DDL內容放入單個數據庫圖層對象中以用於維護目的。 – 2014-09-02 08:41:23

0

我認爲讓您的數據庫查詢或數據處理方法與應用程序邏輯不同是個好主意。這是MVC體系結構解決的問題之一。如果你不熟悉MVC,你現在想讀它,看看它是否符合你的想法。

這是一個link如果你想閱讀它。