2011-01-11 87 views
1

我有一个模型,Entity,我构建了一个EntityMapper和一个Entity类(我只是学习使用Zend Framework并遵循教程)。 Entity类有一个setName方法,我想要它做的是检查数据库中是否有另一个“实体”具有相同的名称,并在这种情况下引发异常或什么。检查Model类中的重复值

所以,如果我理解正确,数据库调用应该只在Mapper类中。因此,内setName,我应该这样做:

$entity = new Application_Model_EntityMapper(); 
if ($entity->checkDuplicateName($name, $this->_id)) 
    $this->_name = $name; 
else 
    throw new Exception(...); 
return $this; 

,并把它实际在映射类的新方法,查询的代码? (当然,如果“实体”是新的或者它已经有一个id,那么查询应该是不同的,但这不是我的问题的重点)。

我知道我可以通过几种方式做到这一点,但我的目标是尽可能地调整框架的约定。

回答

2

由于保存是Mapperobject的责任,我会将验证添加到您的映射器类的保存例程中。 我不明白各自的职责您的不同类型的都有,所以我会解释我的:​​

- Application_Model_Entity是数据的纯结构,这个类有没有相关
- Application_Model_EntityMapper posses与话语权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); 
    } 
} 

我希望代码能够自我解释。 这是最“zendish”的方式我能找到的,希望这可以帮助你对你的方式到ZF-社区:)

链接manual for Zend_Validate_*

+0

只是一点点信息补充:结构模型/映射器/ ActiveRecord和ZendFramework的“快速入门”教程完全一样。 – 2011-01-11 08:35:38

0

我发现,这样做,登记入住的setName使其每次加载从DB(不好)创纪录的时间运行查询,让我感动调用checkDuplicateName的映射类的方法save。 (checkDuplicateName也是Mapper类,现在作为私有方法)

我仍然很想知道这是否是Zend Framework中这种东西的标准方式。