2011-01-11 7 views
1

モデルがEntityで、EntityMapperEntityクラスを作成しました(Zend Frameworkを使用し、チュートリアルに従うだけです)。 EntityクラスにはsetNameメソッドがあります。同じ名前のDBに別の「エンティティ」があるかどうかを確認してください。その場合は例外がスローされます。Modelクラスの重複値のチェック

私が正しく理解している場合、DB呼び出しはMapperクラス内にあるだけです。だから、setNameの内側に、私のような何かを行う必要があります。

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

を、実際にマッパークラスに新しいメソッドでクエリを行うコードを置きますか? (クエリは、もちろん、 "エンティティ"が新しいか、すでにIDを持っている場合には異なるはずですが、それは私の質問のポイントではありません)。

私はいくつかの方法でこれを行うことができますが、私の目標はフレームワークの慣習にできるだけ合わせることです。

答えて

2

保存はMapperオブジェクトの義務であるため、マッパークラスの保存ルーチンに検証を追加します。私はあなたの異なるクラスが持っているもの、それぞれの任務を理解していなかったので、私は私を説明します :

からApplication_Model_EntityMapper武装隊と発言権 - Application_Model_Entityは、データのための純粋な構造体で、このクラスには、依存関係
を持っていませんdbrmsはレコード内のエンティティを変換し、逆も同様です。それはZend_DbTable_Abstractから延び、DBに対してクエリを行うことが可能である、Application_Model_DbTable_Entity ActiveRecordのクラスがあり、それが唯一のマッパーによって使用されている - それはActiveRecordの(DBTABLE)クラス 「所有します」。

$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」方法ですが、これは追加するほんの少しの情報manual for Zend_Validate_*

+0

にZF-コミュニティ:)

リンクにあなたの方法であなたを役に立てば幸いActiveRecordは、ZendFrameworkの「クイックスタート」チュートリアルで使用するものとまったく同じです。 –

+0

これは非常に役に立ちました。私が探していたものです。ありがとうございました! – cambraca

+0

喜んで:) –

0

私はsetNameにそのチェックを行うことは、クエリにそれはデシベル(よくない)からレコードをロードするたびに実行することを引き起こすことを見つけたので、私はマッパークラスのsave方法にcheckDuplicateNameへの呼び出しを移動しました。 (checkDuplicateNameは今私的な方法としてMapperクラスにもあります)

これはZend Frameworkでこのようなことをする標準的な方法であるかどうかはまだ分かりません。

関連する問題