3

リッチなJSアプリケーションを作成していますが、JS/PHPの構造について幅広いアドバイスをお願いします。この質問をどのように分割するかわかりません。質問が多すぎる場合は申し訳ありません。私は情報過多に苦しんでいます!

JSが単一のPHPファイルからJSONオブジェクトを要求することを期待しています。PHPが簡潔で効果的なリクエストに応答するための、最小限で効果的なパターンが必要です。おそらく、JSは、データベースにクエリを実行してJSONをクライアントに返すモデルのようなオブジェクトを呼び出します。

PHP側にとって良いパターンは何でしょうか?クライアントからの命令を解析する大きなswitchステートメントと関連データが乱雑に含まれているPHPファイルをハッキングしました。1つのリクエストに複数の命令を含めることができます。たとえば、javascriptはリクエストを送信します。

$.ajax({
    url: '/ajax.php', dataType: 'json',
    data: {instructions: [{
        instruction: "newPerson",
        data: {
             name: person.name,
             email: person.email
             city: person.city
        }
    }]},
    success: callback, error: ajaxFail
});

コールバックは、このリクエストまたは他のリクエストからPHPが返すオブジェクトを処理するグローバルハンドラーになります。たとえば、上記は、PHPによって生成された人物IDがDBに挿入された新しい人物オブジェクトと、そのIDを持つ都市オブジェクトを受け取る場合があります。他のリクエストもそれらのオブジェクトを返す可能性があるので、単一のハンドラーは理にかなっていますか?(1つの質問は、javascriptが返されたオブジェクトを送信された挿入にどのように関連付けるかです)

PHPページコードに恥ずかしいのですが、次のようになります。

$return = array();
$instructions = $_REQUEST['instructions'];
foreach ($instructions as $instruction){
    switch($instruction['instruction']){
        case 'findPoeple':
            $data = $instruction['data'];
            $res = DB::query("select player from person where player like '%". DB::esc($str) ."%'");
            $return['players'] = array();
            while ($row = DB::fetch($res)){
                $return['players'][] = $row['player'];
            }
        break;
        case 'loadAllPeople':
            // similar code
        break;
        case 'newPerson':
            // similar code
        break;
        default:
            die("command '$command' not recognised");
        break;
    }
}
echo json_encode($return);

明らかに、これには何を変更するかを言うにはあまりにも多くの間違いがあります!しかし、私が探している最終結果が何であるかをかなり明確にしました。OOPを使用してこれを立派な方法で実装するJS/PHPのこの種のアプローチを具体的に示す簡潔なパターンを誰かに教えてもらえますか?

MVCは、豊富なJSアプリが可能になるまで私には理にかなっており、境界は非常にぼやけているように見えます。

ありがとうございました!

4

1 に答える 1

5

tl; dr:PHPが簡潔で効果的なリクエストに応答するための最小限ですが効果的なパターンは、リクエストのタイプごとに個別のPHPスクリプトを使用することです。

PHPでリクエストをルーティングしようとする代わりに、Webサーバーにルーティングを自動的に処理させる方が、おそらくより単純で、より簡単で、よりパフォーマンスが高くなります。あなたがしなければならないのは、次のようcaseに、switchブロック内のそれぞれを独自のスクリプトに分割することです。

/findpeople.php
/loadallpeople.php
/newperson.php

そうすれば、「newperson.php」のリクエストを受け取ったときに、必要なパラメーター(1)、各パラメーターの検証方法(2)、およびクライアントが期待しているリソースの種類(3)を明示的に知ることができます。

例えば:

  1. 'newperson.php'には、が必要な場合があり、name新しい人を作成するにはemailcity
  2. Anameはおそらく文字列です(3〜16文字またはその他の任意の範囲)。アドレスは基本的に文字列ですが、email正しく検証することに関してはいくつかの厄介なものがあり、acityはおそらくaと同様の制約を持つ文字列ですname
  3. クライアントが新しいを作成しようとしpersonている場合、要求が成功したかどうか、および新しいpersonの識別機能(person_idデータベースからの値など)を知りたい場合があります。

最後に、Javascriptで複数のリクエストをグループ化する場合、最も簡単なアプローチは、おそらく、命令ごとに1つずつ、複数の個別のAJAXリクエストを実行することです。


それを次のレベルに引き上げたい場合は、RESTフルWebサービスについて少し調べてから、リソース(この場合はpersonオブジェクトのコレクション)をどのように公開しているかを再考してください。オブジェクトを取り巻く(もっと)RESTフルなアーキテクチャはperson、代わりに次のようになります。

POST /person/-新しい人を作成します
POST/person/ person_id-人を変更します
GET/person /-person_id個人に関する情報を取得します
GET/person/-すべての人を取得します

$_SERVER['request_method']変数を介してPHPのHTTPリクエストメソッドにアクセスし、それに応じて動作することができます。

RESTの原則と実装に関するいくつかの基本的な情報:

  • 妻にRESTを説明した方法
  • (申し訳ありませんが、ウィキペディアとロイ・フィールディングの論文へのリンクを提供していました。彼はRESTを「発明」しましたが、必要な評判はありません)
于 2012-10-18T04:54:31.123 に答える