2

Zendframework で最初のアプリケーションを作成しています。私の質問は、Model-View-Controller (MVC) アーキテクチャ パターンに関するものです。

現在、データベース テーブルを参照するモデルがあります。私が現在持っているクラスは次のとおりです。

Model_Person 
Model_PersonMapper 
Model_DbTable_Person

さて、ネット上でたくさんの例を見かけますが、どれも単純な挿入・更新・削除のケースです。私の状況では、人が存在するかどうかを確認する必要があり、存在しない場合は、それを挿入して ID を取得する必要があります (保存して ID を返すことは知っていますが、それは私がしなければならないことではありません。例)。

非常に単純ですが、他のすべての特定のケースのデータベースロジックをどこに配置するかを知りたいです。他のいくつかのケースでは、他のテーブル全体のチェックが必要になる場合があります...何でも!

Model_XXXXMapper にすべての特定の関数を追加して、実行したい現在の検証/プロセスに非常に具体的なものを追加する必要がありますか? 関数 getIdOfThePersonByNameOrInsertIfNotExists() のように (もちろんサンプル名!!!)

それとも、モデルへの詳細なアクセスが検証されるコントローラーに常駐する必要がありますか?

つまり、すべてのデータ固有の関数またはチェックをどこに配置すればよいのでしょうか?

4

3 に答える 3

1

実際の作業は、コントローラーではなく、モデル オブジェクトで行う必要があると思います。テーブルで始まる選択/作成はperson、次のような DbTable_Person オブジェクトにあります。

// DbTable_Person
// returns sets of or single Person objects
public function createByName( $name ) // perhaps throws exception if name already exists
public function findById( $id )
public function findByName( $name )
public function findHavingAccount( $account_id ) // references another table

// controller
// with your example, like what Galen said,
// I would let the controller handle this logic
$person = $person_table->findByName($name);
if ( !$person ) {
  $person = $person_table->createByName($name);
}
if ( !$person ) { throw new Zend_Exception('huh?'); }
$id = $person->id; // you wanted the ID
于 2009-12-09T17:24:05.437 に答える
1

関数を検索/作成関数に分割することは間違いありません。

これが基本的な実装です...

$personTG = new Model_PersonTableGateway;
if ( !$person = $personTG->findByName( $name ) ) {

    $person = new Model_Person;
    $person->name = $name;
    // other variables
    $newPersonId = $personTG->create( $person ); // creates a new person

}

テーブルゲートウェイを使用しています。クラスを TG に置き換えることができます。

create() 関数で、新しく作成された人物の ID だけを返すか、人物全体を返すかを指定できます。それはあなた次第です。

于 2009-12-09T16:48:35.587 に答える
0

Zend_Validate_Db_NoRecordExists とその姉妹に興味があるかもしれません。Zend_Form を使用している場合は、このバリデータをフォーム要素に追加できます。多くの人は Zend_Form を使用して、ドメイン モデルに到達する前にデータの検証とフィルタリングを行います。

Zend_Form を使用していない場合は、この検証クラスをサービス層で使用できます。単純なサービスクラスは次のようになります

 `
class Service_Person_Validate 
{ 
  public function creatable($data) 
  { // return true|false 
  } 
}
于 2009-12-09T19:01:39.000 に答える