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的“快速入门”教程中使用的完全相同。