2010-12-14 16 views
6

私はPHPでかなりの量の経験をしています(いくつかのWebサイトと2つのブラウザゲームで約5年の経験があります)。 Joomlaのようなプラグインやモジュールを開発するのではなく、コアエンジンを使いこなすのは初めてです。私は他のオブジェクト指向言語(Javaなど)で豊富な経験を持っています。Codeigniterゲームを開発する

私の質問は、自分自身が通常のサイトのようにサイトを開発していることですが、私はそれよりも柔軟性がありたいと思っています。ある意味では、CMSの半分を構築しているような気がします。

たとえば、現在表示されているビューを制御するコントローラを介してメインページが設定されています。ビューファイル自体に

<?php $this->load->view("headerview"); ?> 
<?php $this->load->view($contentview); ?> 
<?php $this->load->view("footerview"); ?> 

(私は動的に他の人が本当に変わらない、contentviewをロードすることができます):メインビューページには、次のようになります。これは私の主な制御ファイルを通してすべての制御を行うので、これは私の最初の質問です、これは正しいですか?

私のインデックス関数は、 "contentview"と "gameview"の変数をロードするビューとしてメインビューを設定します。 「contentview」がゲームの場合、スプリットペインが表示され、1つは選手の統計情報を表示し、もう1つはプレイヤーが現在行っているページ(商店、戦闘、世界の探索など)を示します。何がここに表示されているかを決めるのは、 "gamecontent"変数です( "メイン"コントローラにも渡されます)。要するに、現在、すべてのビュー処理は、主コントローラ、すなわち1つの単一コントローラ内で行われている。

$data['title'] = "Experimental Page"; 
$data['maincontent'] = "gameview"; 
if($page == 1) { 
    $data['gamecontent'] = "townview"; 
} else if ($page == 2) { 
    $data['gamecontent'] = "merchantview"; 
} else if ($page == 3) { 
    $data['gamecontent'] = "explorationview"; 
} else if ($page == 4) { 
    $data['gamecontent'] = "hospitalview"; 
} else if ($page == 5) { 
    $data['gamecontent'] = "fightview"; 
} else if ($page == 6) { 
    $data['gamecontent'] = "adminview"; 
} 

$this->load->helper(array('form','url')); 
$this->load->library('form_validation'); 
$this->load->view('mainview', $data); 

私はまだ戦闘と買い物機能を追加し始めていませんが、このコントローラーが非常に大きく、非常に高速になっているのがわかります。これは私には間違っているようですが、何とかコア・セットアップを正しく配置する方法を定式化することはできません。

私の目標は、癒し、戦い、探索などのように、それぞれが別々のゲーム機能を扱うように(うまくいけば)コントローラーを分割し、私のモデルが(ユーザー、等。)。

誰でもこのプロジェクトを適切に配置する方法を理解できますか?

+1

多少関係はありませんが、すべての条件をルックアップテーブル、つまり '$ table = array(" townview "、" merchantview "、" explorationview "、...)に置き換えることができます。 $ data ['gamecontent'] = $ table [$ page-1];またはそれらの行に沿ったもの。ゲームコンテンツを独自の「設定ファイル」に分けることもできますし、PHPで解析してキャッシュすることもできますが、保守するデータがあまりない場合は、余計かもしれません。 –

+0

これはかなりのデータ量ですが、私はいくつかの方法でページを保存することができたことを認識していますが、これは実際に何かをするだけです:) – Organiccat

+0

コードイグナイター(ポーカー、それ以下)でゲームを開発しました自分が見つけたのと同じ道。振り返ってみると、symfonyはこれに対してはるかに優れたアーキテクチャを提供します。 – Dolph

答えて

3

Symfony Event Dispatcherコンポーネントを使用してこのような処理を行います。 Symfony Frameworkを使用せずにコンポーネントをインストールできるので、CodeIgniterで使用することができますが、既に使用可能なものがあります。私はCodeIgniterを知らない。

イベントディスパッチャーは、Observer Patternの汎用実装です。

  • は、私は、彼らがそれぞれのリクエストがアクションを通過
  • を扱うすべてのアクションのオブザーバーとして自身を登録するモジュールのリストを持っている(例えば、"townview")
  • 私のコントローラは、アクションが名前であったとしてもイベントを作成します。イベント・ディスパッチャー・システムは、そのアクションを処理できると主張するモジュールを見つけ、制御を渡します。

このようにして、何個のアクションを持っていてもメイン・コントローラーを変更する必要はありません。イベントを作成してディスパッチャからスローします。それが処理されていない場合、それは大規模なエラー(DEV)または素晴らしい(PROD)をスローします。

これは、さまざまなユーザー/クライアントのためにオンまたはオフにできる多くのオプションのコンポーネントがある私たちのアプリケーションで特に役に立ちます。コントローラに複雑なロジックはまったくありません。クライアント用に有効化されていないモジュールは登録しません。

+0

私は親密ではありませんイベントのディスパッチに精通していますが、Webサービスとよく似ていますが、それは正しいのですか?たとえば、AMFPHPサーバーを呼び出すFlashプログラムがあります。このサーバーは、呼び出されたオブジェクトのメソッドを処理して結果を返し、サーバー側のコードを一方の側に、クライアント側を別の側に保ちます。同様?または私は間違ったトラックにいますか? – Organiccat

+0

さて、それは*可能かもしれませんが、この場合イベントディスパッチとは関係ありません。アイデアは、各モジュールが中央コントローラーに「私はイベントXを処理できます」と言い、コード内の他の場所でイベントXを作成し、それを処理するように頼むことができます。イベントの作成者(この場合はあなたのコントローラー)がイベントを実際に処理しているもの(例えば、あなたの異なるビュー)について知る必要がないので、カップリングが減少します。 wikiページを見てから、イベントディスパッチャのドキュメントを読んでください。非常に明確に説明されています。 –