2011-01-27 10 views
0

現在、私はHTML部分(ビュー)をレンダリングできるMVCフレームワークのルーティングコードを書いています。これらの部分は、サーバー側またはクライアント側(MootoolsのHTML要求を使用して)読み込むことができます。すべてのページのレイアウトは、複数の部分から構築されます。私はそれを休ま対応になりたいとして、次のように、部分的に各HTML(ビュー)が(インデントが意図した文書構造を示した)、定義されたURL空間のURLにマップ:同じURL /ルートのHTMLパーシャルレイアウトとフルレイアウトを区別する

... 
/  
    /navigation 
    /content 
    /profile 
     /profile/1 
     /profile/1/message/ 
      /profile/1/message/1 
      /profile/1/message/2 
... 

今の問題は、私がしたいということです人々は "/プロフィール"を訪問し、HTML部分的に表示されず、代わりに完全なレイアウトを表示できるようになりました。例えば、

1)パーシャルのためのURLで別の名前空間/プレフィックスの作成:私は、次のことを考えた

  • /プロファイルの完全なレイアウトのための部分のための
  • /部分/プロファイルを

2)カスタムHTTPヘッダーを送信して、完全なレイアウトを要求するカスタムHTTPヘッダーを部分的に要求するか、要求しません。

最初のオプションはReSTに準拠したキャッシュフレンドリですが、未知の可能性のある他のオプションについてはまだわかりません(実際の問​​題です)。

  1. 私が要求してパーシャルと完全なレイアウトを区別しなければならないのは何の選択肢:

    私は上記の解決策の1の実装を開始する前に、私は次の質問を持っていますか?

  2. 各部分のクライアント側の状態/コンテキストを保持するベストプラクティスは何ですか?
+0

私は正確な問題を理解していません。 http://example.com/content/profile/1/message/2にあるメッセージのリソースを利用可能にし、http://example.com/content/profile/にプロファイルを持つことができると説明したURLのヒントを与えられます1 – ordnungswidrig

+0

問題は、レイアウト(ヘッダー、フッター、ナビゲーションなし)を除いた*部分的なものとして "example.com/content/profile/1"を要求し、 "example.com/content/profile/"を要求することを区別する必要があることです。レイアウト(ヘッダ、フッタ、およびナビゲーションを含む)の部分*として* 1を指定します。これは、キャッシュに適した方法で行う必要があります。 – Komerdoor

答えて

1

クライアント側をリクエストすると、サーバーはxmlhttprequestの値を持つ余分なヘッダーHTTP_X_REQUESTED_WITHを受け取ります。

if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && 
    strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') { 
    .... 
} 

これは、カスタムタイプを追加するのではなく、テストするための信頼できるヘッダーです。

+0

ありがとうございます。私はMootoolsがそれをやっていることに気付きましたが、mod_rewriteによって取り除かれました。 しかし、問題は、カスタムHTTPヘッダーを使用して異なるコンテンツを取得することは、キャッシュに適していないことです。キャッシュ層は、GET /プロファイル(カスタムヘッダーなし)とGET /プロファイル(カスタムヘッダー付き)を区別することはできません。もちろん、いくつかのキャッシュがそれをサポートするかもしれませんが、それは想定できるものではありません。 それでは、私は、URLヘッダをオーバーライドするために、通常は?format = を使用するのと同じように、部分的に要求するために?route = partialのようなURLパラメータを追加することができることに気付きました。 – Komerdoor

+0

ワニスはX-Requested-With HTTPヘッダーを区別できることがわかります。サーバー側の構成バージョン(古典的なスタイル)では、ESIを使用して、ワニスに部分文字を含めることができます。クライアントサイドの合成バージョン(ajaxスタイル)では、HTMLリクエストを使用してパーシャルを含めることができます。どちらの場合も、ワニスは私のためにパーシャルをキャッシュします。残っている唯一の問題は、ほとんどのWebブラウザが区別できず、ブラウザのキャッシュから間違ったキャッシュされたコンテンツを表示することです(部分的なレイアウトを含む完全なレイアウトではなく部分的なものです)。私を軌道に乗せてくれてありがとう。 – Komerdoor

+0

もう1つの方法は、部分ビューのためだけにサーバーに2番目のホスト名をエイリアスし、サーバーコードの接頭辞をテストすることです。完全なページビューはexample.com/content/...から来ますが、p.example.com/content /からの部分的なビューは... – leebriggs

1

オプション1は、オプション2より優れたソリューションです。RESTfulシステムでは、メソッドの欠如を補うために常に新しいリソースを作成します。

カスタムヘッダーを作成することは本当に悪い考えです。

+0

確かに。表記を区別するためのカスタムヘッダーに応じて、ほとんどのキャッシュが確実に破損します。私はちょうどサーバ上のシングルサインとESIを使ったオブジェクトキャッシュとして動作するVarnishを設定しました(レイアウトがサーバサイドで構成されている場合のみ使用されます)。今ではMVCコードをできるだけきれいに保つことができます。 Redis(NoSQL)ドライバとHTMLヘルパーは、20行のコードを超える唯一のパーツです。私が学んだ1つのルールは、古いWeb標準のほとんどが、通常は回避策をよく考えているということです。間違ったやり方で何かをやっているということです。答えてくれてありがとう。 – Komerdoor

関連する問題