2010-12-02 19 views
0

Ajaxアプリケーションからのリクエストに応答するサーバー側スクリプトを設計するのは難しいです。Ajaxリクエストに応答するPHPサービスを構成する方法

現在、アプリは個別のページ(注文、アイテム、財務など)に分割されています。これらのページを切り替えると、実際のWebページがリロードされます。各ページにはそれ自身の「演算子」があります。この演算子は、すべてのAjax要求を対象とするルートoperator.phpに必要です。各オペレータに含ま

このパターンである:

foreach ($actions as $action) { 
    switch ($action) { 
    case 'get-items': 
     [...] 
     break; 
    case 'get-item': 
     [...] 
     break; 
    case 'update-item': 
     [...] 
     break; 
    [...] 
    } 
} 

は、例えば、リクエストによって供給されoperator.php?page=items&action=get-item&id=123

アプリケーションが複雑になるにつれて、アクションが要求されたコンテキストから各アクションのロジックを分離するのに役立ちました。

私はPHPの内部アクションのロジックを使用したいとき、私は頻繁にこのパターンを使用した:

$items = json_decode(file_get_contents('http://[...]/operator.php?action=get-items')); 

(言うまでもなく、この設計は、余分なオーバーヘッドの多くを作成します。)

代わりに、私は今、各ページによって拡張されるOperatorクラスを持っています。私は、例えば、ItemsOperatorを作成し、直接私が望むアクションを呼び出し、任意のエンコードまたはデコードや余計なHTTPリクエストのないことができます。

$items = $itemsOperator->getItems(); 

私は演算子クラスを使用するAjaxリクエストに対応するスクリプトを変更し、そのよう:

foreach ($actions as $action) { 
    switch ($action) { 
    case 'get-items': 
     $json['items'] = $operator->getItems(); 
     break; 
    [...] 
    } 
} 

if (count($json)) { 
    echo json_encode($json); 
} 

このアプローチはうまく合理的に動作しますが、私は正式なWeb開発のトレーニングを持っていたことがありません、と私は疑いが確立されている、(私はmaddeningly Googleで見つけることができません)、より良い、抽象化されたパターン。

  1. 「アクション」を含む「演算子」クラスの概念があまりにも曖昧であり、すべての包括的な:私の自家製のアプローチの多くの欠点は、この質問に影響を与えました。どのようにロジックを分離する必要がありますか?
  2. アプローチが特に乱雑になるのは、たとえば、財務ページのアイテムDBを検索する必要がある場合です。 FinancesOperatorの横にItemsOperatorも含めますか? (私は現在ロジックを複製しています)
  3. AjaxリクエストスクリプトとOperatorオブジェクトをインターフェースする良い方法がありますか?例えば、私は現在、URL「アクション」変数をオペレータオブジェクトの対応するメソッドにマップするスクリプトを各ページに記述する必要があります。

非常に残念ですが、この質問には余裕があります。アイデアを跳ね返す開発者はいません(実際のトレーニングはありませんでした)ので、SOコミュニティのアドバイスを聞くことは非常に貴重です。このようなスクリプトを設計する場合、可能性/アプローチ/戦略の数は完全に圧倒的である可能性があります。ある特定のアプローチで数日間投資したら、元に戻すことは非常に困難です。

ご迷惑をおかけして申し訳ありません。

答えて

0

完全な回答ではありませんが、私はoperator.phpを2つのファイルに分けます。 1つはoperator.phpと呼ばれ、もう1つはoperator_ajax.phpと呼ばれます。 operator.phpあなたは何をしているのですか?それをエコーするのではなく、変数に入れて含めることができます。 operator_ajax.phpにはoperator.phpが含まれ、値がエコーされます。 operator.phpは、あなたが望む他のファイル(HTTP要求を置き換える)から取り込むことができます。

+0

これは本質的に私がやったことです。 "ajax_operators"は、ルートajax_operatorに含まれています。そして、アクションは 'page1.action1'の形式で要求されるので、別のページからの1つのページのアクションを使用できます(ユーザーがアクセスできると仮定して)。さらに、リクエストメソッド(HTTPなど)から抽象化されているため、別のページの「演算子」クラスを使用する1ページのアクションを記述できます。 – JKS

1

Model-View-Controllerアーキテクチャパターン(http://en.wikipedia.org/wiki/Model-View-Controller)について読んでみてください。

あなたが要求し、これらの種類を実行していた

$items = json_decode(file_get_contents('http://[...]/operator.php?action=get-items')); 

...あなたは、サービスクラスにロジックをカプセル化する必要があります。したがって、「財務ページのアイテムDBを検索する」のような操作を行う場合は、ロジックをカプセル化するサービスに単純に依存することができます。

オブジェクト指向プログラミングの中心的な原則についてもう少し読まれると、デザインパターンの概要だけでなく、詳細な説明も得られます。私はヘッドファーストデザインパターンをチェックアウトすることをお勧めします。

+0

おすすめを評価する - 今すぐ書き留めてください!私はMVCパターンについて少しは読んだことがありますが、フロントエンドとサーバー側の間でロジックが分離されているAjaxアプリケーションのコンテキストでは、どのように動作するのか分かりません。 – JKS

関連する問題