2

我正在寫Zendframework我的第一個應用程序。 我的問題是關於模型 - 視圖 - 控制器(MVC)架構模式。MVC模型在哪裏把數據具體檢查

我目前有一個模型參考數據庫表。 下面是我目前擁有的類:

Model_Person 
Model_PersonMapper 
Model_DbTable_Person 

現在,我看到了很多在網絡上的例子,但個個都是的插入/更新/刪除簡單的情況。 在我的情況下,我必須檢查一個人是否存在,如果不存在,我必須插入它並檢索ID(我知道保存返回ID,但這不完全是我必須做的,這是和例子)。

它退出簡單,但我想知道在哪裏把數據庫邏輯的所有其他特定情況。其他一些情況可能涉及檢查其他表或任何!

我應該在我的Model_XXXXMapper中添加所有特定函數,這些函數對於我想要執行的當前驗證/過程而言是非常具體的?像一個函數getIdOfThePersonByNameOrInsertIfNotExists()(當然樣本名稱!!!)

或者它應該駐留在控制器中的一些不太具體的訪問我的模型將被驗證?

換句話說,我應該在哪裏放置所有數據細節函數或檢查?

+0

您可能會對Zend_Validate_Db_NoRecordExists及其姐妹感興趣。如果您正在使用Zend_Form,則可以將此驗證器添加到您的表單元素。 如果你不使用Zend_Form,你可以簡單地在你的服務層使用這個驗證類。一個簡單的服務類就應該像這樣 類Service_Person_Validate { 公共功能可創建($數據) {// 返回true |假 }} 請 – Sudheer 2009-12-09 18:58:50

+0

上面無視我的意見。我打算在答案框中輸入。 – Sudheer 2009-12-09 19:05:02

回答

1

我認爲真正的工作應該發生在您的模型對象中,而不是控制器中。任何選擇/創建開始與person表將在DbTable_Person對象,像:

// DbTable_Person 
// returns sets of or single Person objects 
public function createByName($name) // perhaps throws exception if name already exists 
public function findById($id) 
public function findByName($name) 
public function findHavingAccount($account_id) // references another table 

// controller 
// with your example, like what Galen said, 
// I would let the controller handle this logic 
$person = $person_table->findByName($name); 
if (!$person) { 
    $person = $person_table->createByName($name); 
} 
if (!$person) { throw new Zend_Exception('huh?'); } 
$id = $person->id; // you wanted the ID 
+0

我讀過的地方,這取決於我......這只是一個最終的偏好問題。一個瘦控制器與胖控制器。正如你所說,我寧願將數據庫的邏輯保存在模型中。謝謝 – Pmax 2009-12-11 13:45:08

1

我肯定會將功能拆分爲搜索/創建功能。

這裏有一個基本的實現...

$personTG = new Model_PersonTableGateway; 
if (!$person = $personTG->findByName($name)) { 

    $person = new Model_Person; 
    $person->name = $name; 
    // other variables 
    $newPersonId = $personTG->create($person); // creates a new person 

} 

我用table gateway。你可以用你的班級替代TG。

你可以讓create()函數只返回新創建的人員的ID,或者整個人......這取決於你。

+0

你會在控制器或任何執行操作/檢查的類中執行此操作嗎? 我認爲所有的數據或數據庫邏輯都必須駐留在模型中。但好的,thx。 – Pmax 2009-12-09 16:53:35

+0

這將發生在控制器中。控制器使用模型作爲數據檢索器爲視圖準備信息。這就是代碼所做的一切。 – Galen 2009-12-09 16:57:30

0

您可能會感興趣的Zend_Validate_Db_NoRecordExists及其姐妹。如果您正在使用Zend_Form,則可以將此驗證器添加到您的表單元素。許多人使用Zend_Form在數據到達領域模型之前驗證和過濾數據。

如果你不使用Zend_Form,你可以簡單地在你的服務層使用這個驗證類。一個簡單的服務類可能類似於

` 
class Service_Person_Validate 
{ 
    public function creatable($data) 
    { // return true|false 
    } 
}