好了,所以我有我的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的/型號是不允許的瞭解專家說的任何數據源?
我已經去到的頁碼上的谷歌今天我想我從來沒有去上,我仍然無法找到的東西做任何非常堅實的現實生活中的例子,我開始發瘋,因爲它減緩了一切。
任何幫助,將不勝感激。謝謝。
啊是的這就是我想念的感謝。有一件事,'$ fetchByName()'方法將返回一個'$ user'對象,如果它在該數據庫中使用該用戶名找到一行的話?如果我想檢查提供的電子郵件地址是否已經存在,請使用我的'$ fetchByEmail()'方法? – ibanore
我使用名稱fetchByName,除了fetchById之外,它通常是CRUD中的一種方法。但是,無論如何,這只是一個例子,表明我對服務方法的外觀和行爲的看法。當然,你可以有更多的DAO方法,比如fetchByEmail()等。但是,通常,userDAO-> isUsernameTaken($ username)是不正確的,執行此檢查不是DAO的責任,它應該在服務層中使用DAO完成,正如我已經顯示的那樣。 –
好的感謝,但不是隻能夠執行'userDAO-> isUsernameTaken($ username)''執行一個小的簡單查詢返回一個布爾正確的事情是'$ user = $ userDAO-> fetchByName($ username) ;'這將創建一個User對象,如果一行被返回,那麼我通過執行'if($ user!= null)'來檢查用戶名是否存在?它看起來對我來說真的是低效率和矯枉過正。當我開始這樣做時,我已經可以看到我將不得不使函數始終返回對象,而不僅僅是布爾值。 – ibanore