Zend framework 检查模型类中的重复值
我有一个模型,Zend framework 检查模型类中的重复值,zend-framework,zend-db,Zend Framework,Zend Db,我有一个模型,Entity,我构建了一个EntityMapper和一个Entity类(我正在学习使用Zend框架并遵循教程)。Entity类有一个setName方法,我想让它做的是检查数据库中是否有另一个同名的“Entity”,在这种情况下抛出异常或其他东西 因此,如果我理解正确,DB调用应该只在Mapper类中。那么,在setName中,我是否应该执行以下操作: $entity = new Application_Model_EntityMapper(); if ($entity->ch
Entity
,我构建了一个EntityMapper
和一个Entity
类(我正在学习使用Zend框架并遵循教程)。Entity
类有一个setName
方法,我想让它做的是检查数据库中是否有另一个同名的“Entity”,在这种情况下抛出异常或其他东西
因此,如果我理解正确,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,那么查询应该是不同的,但这不是我问题的重点)
我知道我可以用几种方法来实现这一点,但我的目标是尽可能地调整框架的约定。我发现在
setName
中执行该检查会导致它在每次从db加载记录时运行查询(不好),因此,我将对checkDuplicateName
的调用移动到Mapper类的save
方法。(checkDuplicateName
现在作为私有方法也在映射器类中)
我仍然很想知道这是否是在Zend Framework中执行此类操作的标准方法。因为保存是Mapperobject的职责,所以我会将验证添加到mapper类的保存例程中。 我不明白你们不同的班级各自有什么职责,所以我会解释我的职责: -
Application\u Model\u Entity
是数据的纯结构,此类没有依赖项-
Application\u Model\u EntityMapper
拥有与DBRM对话的权利,将转换记录中的实体,反之亦然。它“拥有”ActiveRecord(DbTable)类
-Application\u Model\u DbTable\u Entity
是ActiveRecord类,它从Zend\u DbTable\u抽象扩展而来,能够对DB进行查询,它仅由映射程序使用
$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);
}
}
我希望代码能自我解释。
这是我能找到的最“zendish”的方式,希望这能帮助您进入zf社区:)
链接到只需添加一点信息:结构模型/Mapper/ActiveRecord与ZendFramework的“快速入门”教程中使用的完全相同。