我有一个模型,Entity
,我构建了一个EntityMapper
和一个Entity
类(我只是学习使用Zend Framework并遵循教程)。 Entity
类有setName
方法,我想要它做的是检查数据库中是否有另一个“实体”具有相同的名称,并且在这种情况下抛出异常或其他东西。
所以,如果我理解正确,DB调用应该只在Mapper类中。所以,在setName
里面,我应该做些什么:
$entity = new Application_Model_EntityMapper();
if ($entity->checkDuplicateName($name, $this->_id))
$this->_name = $name;
else
throw new Exception(...);
return $this;
并将实际执行查询的代码放在Mapper类的新方法中? (当然,如果“实体”是新的,或者如果它已经有了id,那么查询应该是不同的,但这不是我的问题所在。)
我知道我可以通过几种方式实现这一目标,但我的目标是尽可能地调整框架的惯例。
答案 0 :(得分:2)
由于保存是Mapperobject的职责,我会将验证添加到mapper类的保存例程中。 我不明白你们不同班级的职责是什么,所以我会解释一下:
- Application_Model_Entity
是数据的纯结构,此类没有依赖关系
- Application_Model_EntityMapper
拥有与dbrms交谈的权利,将改变记录中的实体,反之亦然。它“拥有”ActiveRecord(DbTable)类
- Application_Model_DbTable_Entity
是ActiveRecord类,它从Zend_DbTable_Abstract扩展而来,能够对数据库进行查询,它只由Mapper使用。
$entity = new Application_Model_Entity();
$entity->setName('something which already exists');
$mapper = new Application_Model_EntityMapper();
$mapper->save($entity); // throws Exception
// works with:
class Application_Model_EntityMapper
{
/** @var Application_Model_DbTable_Entity */
private $dbTable;
...
public function save(Application_Model_Entity $entity)
{
$doValidation = ! $entity->getId(); // no id means not in db yet
if ( $doValidation )
{
$hasDuplicatesValidator = new Zend_Validate_Db_RecordExists(
'table' => 'entity',
'field' => 'name'
);
$hasDuplicates = $hasDuplicatesValidator->isValid($entity->getName());
if ( $hasDuplicates )
{
throw new Exception('There is already a record in the db with this name!');
}
}
// go on and save
$this->dbTable->save($entity);
}
}
我希望代码解释自己。 这是我能找到的最“热情”的方式,希望这能帮助你走向zf社区:)
答案 1 :(得分:0)
我发现在setName
进行检查会导致每次从db加载记录时运行查询(不好),所以我将调用移到了checkDuplicateName
save
1}} Mapper类的方法。 (checkDuplicateName
也在Mapper类上,现在作为私有方法)
我仍然想知道这是否是在Zend Framework中执行此类操作的标准方法。