2

MVC アプリケーションに ZF を使用していますが、コードをどのように構成するべきかについて非常に混乱しています。

基本的に、アプリで実行したいすべての機能を備えた1つの巨大な長いファイルである手続き型アプリケーションを持っています... getUsername($ id)など。現在のコードベースは機能せず、がらくたで、デバッグが困難です。

私はMVCを初めて使用し、すべてをどのようにレイアウトする必要があるか、何と通信する必要があるかなどについて非常に混乱しています。したがって、ビューがテンプレートであり、コントローラーがスキニーである必要があり、ファットモデルが必要であることを知っていますが、私はロジックが必要な場所が混乱しています。

私はゲームを作っていますが、そこには通常、ユーザー、村、軍隊、MapSquares、リソースなどのオブジェクトがあります。

理論的に完全に考えていた場合、1 つのユーザー オブジェクトには多くの村が含まれ、各村は 1 つの正方形に属し、軍隊 (多くのユニットを含む) が含まれます。

したがって、モデルにはロジックを含めず、データを取得するための get および set 関数のリストのみを含める必要があり、処理のロジックはマッパー内で質問を行う必要があると考えました...のように:

$villageMapper = new VillageMapper();
// Get village from database using mapper 
$village = $villageMapper->getVillage($id, new Village());

2 つの村が互いに攻撃し合った結果を判断したい場合、どこで行うのでしょうか? 私は次のようなことをしますか:

$outcome = $villageMapper->determineAttackOutcome($village1, $village2);

それとも、内部にロジックが少し入った戦闘オブジェクトですか?

$battle = new Battle();
// Add participants
$battle->addAttacker($village1)->addDefender($village2);
$outcome = $battle->performAttack();
// Save village changes cause of battle
$villageMapper->save($battle->getAttacker());
$villageMapper->save($battle->getDefender());

私はたくさんの DbTable php ファイルを持っており、そこにすべてのデータベース コードが入っていると思います...だから私の質問は: 私の Mapper オブジェクトは、データベースへの取得や保存などにのみ使用されるべきですか?

ありがとう、ドム

4

3 に答える 3

5

MVC にはさまざまな解釈がありますが、私は次のように理解しています。

モデル: 特定の項目に関連する実質的にすべてのロジックが含まれています。モデル化する必要があるそれぞれのもの (あなたの場合、ユーザー、村など) には、それに対応するモデルがあります。モデルには、データを取得したり、データを入れたりする関数があります (つまり、ゲッターとセッター)。モデルはエラーチェックなども行い、競合するものが入力されていないことを確認します。

表示: ロジックはまったくありません。Web アプリケーションでは、これは文字どおり、ページ上のどこに何かを配置するかを示すものです。一部のフレームワークでは、ビューにモデル (つまり、ASP.NET MVC3) をフィードしますが、他のフレームワーク (php の Savant3 など) では、何でもフィードできます。通常、コントローラーはビューにフィードしますが、ビューにモデルが指定されている場合は、モデルから読み取るだけで書き込みはしません。

コントローラー: ユーザーとモデルの間の対話を制御します。ユーザーが何かを行うと、コントローラーはそれをモデルが実行しなければならないことに変換します。たとえば、プログラムに「私のキャラクターを北に 6 マス移動してください」と言うと、コントローラーは「ここから北に 6 マス移動するものはありますか?」と答えます。そして、スポットがクリアであると判断した場合は、キャラクター モデルに「北に 6 マス移動してください」と伝えます。それを行った後、その結果として表示されるべきものに関するデータをビューに送信します。コントローラーに実装される実際のロジックのほとんどは、モデル モデルではなくユーザー モデルにする必要があります。モデル間の相互作用は、個々のモデルのメソッド、またはある種の動作または相互作用をカプセル化する他のモデルのいずれかによって処理できます。

だから、あなたの実装に:

コンストラクターが 2 つの村または戦っているものを取得する戦闘オブジェクト (モデル) を作成します。execute または doBattle と呼ばれるメソッド、またはコントローラーが呼び出す何かがあり、戦闘オブジェクトがそのロジックを実行して結果を決定し、戦闘員のステータスを更新します (つまり、HP を下げる、経験値を与えるなど)。コントローラーが何をすべきかを知るために、結果をコントローラーに返します (つまり、モデルが死亡したためにコントローラーがモデルを忘れる必要がある場合は、そのことを伝えます)。この戻り値は、戦いの結果を伝えるためにビューに送信されるものでもあります。

一部のモデル (ユーザー、村など) はデータベースに保持されるため、モデルは自身をそのデータベースにマップする方法を認識し (または、モデルをマップする方法を知っている別のレイヤーと通信します)、データベースなどの更新の正確な実装に注意してください(コントローラーは実際のメソッドを呼び出して「保存」しますが、モデルだけが舞台裏で何が起こっているかを知っています)。他のモデル (バトルなど) は、何らかの相互作用をカプセル化したロジックにすぎないため、データベースに存在する必要はありません。

于 2012-04-12T20:37:05.470 に答える