2011-01-11 89 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中這種東西的標準方式。