2013-01-02 79 views
1

好了,所以我有我的domainObject /型號叫$user$userDAO對象做查詢。域對象和DAO。如何從域對象內,但仍然有兩個對象不知道對方存在

從我到目前爲止,當我需要做一個CRUD操作一樣取得一個$user對象我只是做閱讀:

$user = $userDAO->fetchById($userId); 

,並且將返回我的$user對象。

顯然,domainObject的不應該知道的是,DAO對象存在,反之亦然但如果用戶註冊和我運行$user->register()方法

$user->register($firstName, $lastName, $emailAddress, $username, $password etc.); 

某處在該方法中,我需要檢查已選擇的用戶名已被使用且與電子郵件地址相同。

我能想到這樣做的唯一途徑是有我$user對象的$userDAO對象的實例,然後做驗證,如:

if($this->userDAO->isUsernameTaken($username)) { 
    // the username is already in use 
} 
else { 
    // continue on 
} 

但是,這將打破規則,即domainObject的不應該知道數據庫的東西,反之亦然,但我認爲DomainObject並不真正瞭解數據庫的東西,因爲所有的查詢都在DAO對象中,它只是對一個對象的引用,但它並不明確知道發生了什麼在那個對象中。我是對還是錯?

如果我做了錯誤的方式,我應該如何運行的方法類似$user->register()這需要調用一些數據庫查詢它裏面它需要訪問數據源,但domainObject的/型號是不允許的瞭解專家說的任何數據源?

我已經去到的頁碼上的谷歌今天我想我從來沒有去上,我仍然無法找到的東西做任何非常堅實的現實生活中的例子,我開始發瘋,因爲它減緩了一切。

任何幫助,將不勝感激。謝謝。

回答

3

如果你在一個分層架構的角度來考慮你的應用程序的架構,你需要在領域層和DAO層之上構建另一層,留下這兩個層會是這樣的。這個新層被稱爲服務層,或者是應用層。這個服務層的工作是執行用例,比如「註冊」一個新用戶。例如,在服務層一類可能是UserService這peforms使用與用戶的情況下,

class UserService { 

private UserDao userDao; 

// constructor 
userSercie(){ 

} 

// registers a user 
register($firstName, $lastName, $emailAddress, $username, $password etc.) { 
    $user = $userDAO->fetchByName($username); 
    if($user != null) { 
     // the username is already in use 
    } 
    else { 
     // continue on 
    } 

    } 

// other service methods such as 


} 

爲什麼我們需要服務層?正是爲了迴應像你這樣的問題,我們需要服務層。這樣你可以看到我們可以保持不同模塊之間的關注。

+0

啊是的這就是我想念的感謝。有一件事,'$ fetchByName()'方法將返回一個'$ user'對象,如果它在該數據庫中使用該用戶名找到一行的話?如果我想檢查提供的電子郵件地址是否已經存在,請使用我的'$ fetchByEmail()'方法? – ibanore

+0

我使用名稱fetchByName,除了fetchById之外,它通常是CRUD中的一種方法。但是,無論如何,這只是一個例子,表明我對服務方法的外觀和行爲的看法。當然,你可以有更多的DAO方法,比如fetchByEmail()等。但是,通常,userDAO-> isUsernameTaken($ username)是不正確的,執行此檢查不是DAO的責任,它應該在服務層中使用DAO完成,正如我已經顯示的那樣。 –

+0

好的感謝,但不是隻能夠執行'userDAO-> isUsernameTaken($ username)''執行一個小的簡單查詢返回一個布爾正確的事情是'$ user = $ userDAO-> fetchByName($ username) ;'這將創建一個User對象,如果一行被返回,那麼我通過執行'if($ user!= null)'來檢查用戶名是否存在?它看起來對我來說真的是低效率和矯枉過正。當我開始這樣做時,我已經可以看到我將不得不使函數始終返回對象,而不僅僅是布爾值。 – ibanore