我正在用Zendframework编写我的第一个应用程序。 我的问题是模型 - 视图 - 控制器(MVC)架构模式。
我目前有一个模型,参考数据库表。 这是我目前的课程:
Model_Person
Model_PersonMapper
Model_DbTable_Person
现在,我在网上看到很多例子,但所有这些都是插入/更新/删除的简单案例。 在我的情况下,我必须检查一个人是否存在,如果不存在,我必须插入它并检索ID(我知道保存返回Id,但这不是我必须做的,这是和例子)。
它很简单,但我想知道将数据库逻辑放在何处以适应所有其他特定情况。其他一些案例可能涉及其他表格的检查或......等等!
我是否应该在Model_XXXXMapper中添加所有特定功能,并使用我想要执行的当前验证/流程的特定功能?像函数getIdOfThePersonByNameOrInsertIfNotExists()(当然是样本名称!!!)
或者它应该驻留在控制器中,并且具有一些不太具体的特性,可以验证对我的模型的访问权限吗?
换句话说,我在哪里放置所有数据细节功能或检查?
答案 0 :(得分: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 ......这取决于你。
答案 1 :(得分: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
答案 2 :(得分:0)
您可能对Zend_Validate_Db_NoRecordExists及其姐妹感兴趣。如果您使用的是Zend_Form,则可以将此验证器添加到表单元素中。许多人使用Zend_Form在数据到达域模型之前验证和过滤数据。
如果您不使用Zend_Form,则只需在服务层中使用此验证类即可。一个简单的服务类可能类似于
`
class Service_Person_Validate
{
public function creatable($data)
{ // return true|false
}
}