2

我正在用 Zendframework 编写我的第一个应用程序。我的问题是关于模型-视图-控制器 (MVC) 架构模式。

我目前有一个参考数据库表的模型。这是我目前拥有的课程:

Model_Person 
Model_PersonMapper 
Model_DbTable_Person

现在,我在网上看到很多例子,但都是简单的插入/更新/删除的例子。在我的情况下,我必须检查一个人是否存在,如果不存在,我必须插入它并检索 ID(我知道保存返回 ID,但这不完全是我必须做的,这是和例子)。

这很简单,但我想知道在哪里放置所有其他特定情况的数据库逻辑。其他一些情况可能涉及跨其他表的检查或......无论如何!

我是否应该在我的 Model_XXXXMapper 中添加所有特定功能,其中包含我想要执行的当前验证/过程非常具体的内容?就像一个函数 getIdOfThePersonByNameOrInsertIfNotExists() (当然是示例名称!!!)

或者它是否应该驻留在控制器中,对我的模型进行一些不太具体的访问将得到验证?

换句话说,我应该把所有数据细节功能或检查放在哪里?

4

3 回答 3

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

}

我使用表网关。你可以用你的班级代替 TG。

你可以让 create() 函数只返回新创建的人的 id,或者整个人……这取决于你。

于 2009-12-09T16:48:35.587 回答
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
于 2009-12-09T17:24:05.437 回答
0

您可能对 Zend_Validate_Db_NoRecordExists 及其姐妹感兴趣。如果您使用 Zend_Form,您可以将此验证器添加到您的表单元素中。许多人使用 Zend_Form 在数据到达域模型之前对其进行验证和过滤。

如果您不使用 Zend_Form,您可以简单地在您的服务层中使用这个验证类。一个简单的服务类可能类似于

 `
class Service_Person_Validate 
{ 
  public function creatable($data) 
  { // return true|false 
  } 
}
于 2009-12-09T19:01:39.000 回答