2011-01-07 4 views
3

私はPHPを使用しています。私は、MVCの仕組みについてもっと学ぶために、最初からMVCセットアップを作成したいと思っています。私は引数の区切り文字としてスラッシュ付きのきれいなURLを使いたい。 GETメソッドフォームについては、どのようにこれを行うのですか?あるいは、人々はGETメソッドのフォームを一緒に避けますか?MVCフォームのURL書式設定の仕方は?

今のよう私が想像することができる方法は次のとおりです。

  1. (これはそれが難しいいくつかのケースでは、ユーザーのブックマーク/リンクをできるようになりますが)GETメソッドのフォームを使用しないでください。
  2. フォーム提出の代わりにAJAXを使用します(ただし、SEOやJSの障害にはどうしますか?)。
  3. postメソッドを使って自分自身に送信するページを作成してから、ポストバースをURLにリフォームし、ヘッダーを使ってそのURLに再ルーティングします(無駄なリソースのようです)。

ご意見やお勧めのご案内をお待ちしております。

+0

これには多くの異なる意見があるようです。 – dqhendricks

答えて

3

変数を取得してクリーンURLが互いに矛盾しないようにします。あなたはいつもあなたの場合、代替URLのスタイルもこれらの2例では

http://example.com/controller/action/value1/foo/value2/bar または http://example.com/controller/action/foo/bar

ようになり

http://example.com/controller/action?value1=foo&value2=bar

のようなURLを持つことができますこれらのURLを作成したいあなたは正しいURLをアセンブルするためにJavaScriptを使用しなければならないので、非常に最初の解決策は実装が簡単かもしれません。

もう1つの質問は、POSTとGETフォーム提出の間の決定です。 POSTはより安全ですが、あなたが言ったように、ユーザーはブックマークできません。

1

MVCのフレームワーク/原則がどのように動作するかを理解することに興味がある場合は、それらを実装する方法(CodeIgniterのようなもの)を理解することが最善の方法です。次に、ソースコード/ドキュメントを掘り下げ、

深いところでジャンプして、MOD_REWRITEを読んでURLの問題を解決してください。 GETは使用できます - あなたはURLコンポーネントを書き換えるだけです。

+0

modリライトは、きれいなURLを真のURLに向けることができますが、最初にきれいなURLに行くためのGETメソッドフォームはどうやって取得できますか? modを2回書き直しますか? – dqhendricks

+1

フォームコードでMETHOD = "GET" ACTION = "/ url/1/param/2"の代わりにMETHOD = "GET" ACTION = "?url = 1&param = 2"の代わりに使用しますか? – diagonalbatman

0

これに対する回答は、結果のページがどのようなページになるかによって異なります。ユーザーに単一の項目があるページを提供する場合は、かなりのURLでそのページにリダイレクトします。それはシステムに対する大きな需要ではありません。

検索クエリの結果の一覧を表示する場合は、書式なしのGETクエリを使用することをおすすめします。唯一つのフィールドがあった場合、私はよく、より簡単なフォームにリダイレクトかもしれないが、一方、

http://www.example.com/search?name=lonesomeday&site=stackoverflow 

http://www.example.com/search/lonesomeday 
これは、すべての後、人々は周りに渡すかもしれない便利なURLである可能性があり

もちろん、YMMVです。

0

2番目のアプローチについては忘れてください。恐ろしい考えです。

  1. URLは重要ではないため、通常は「GETフォーム」で標準のQueryString(...?a=b&c=d)を使用できます。しかし
  2. 、あなたが本当にいいのURLにフォーム(GET/POST - 重要ではありません)を送信する必要がありますすべての時間を持ちたい場合は、ユーザーをリダイレクト:

    if (/* form has been submitted */) { 
        $data = array_map("urlencode", $_GET); 
        $url = sprintf('/%s/%s/%s', $data['a'], $data['b'], $data['c']); 
    
        header("Location: $url"); 
        echo "Redirection: <a href='$url'>$url</a>"; 
        exit; 
    } 
    
  3. 結局あなた場合を「あなたがそれを行うためにはJavaScriptを使用することができ、サーバーのリソースを心配して再:もちろんサーバ側リダイレクトの

    formReference.addEventListener("submit", function() { 
        /* do exactly the same as above PHP code */ 
    
        return false; 
    }, false); 
    

    を誰かがJSを無効にしている場合には残しておく必要があります。

3

あなたの3ポイントがどれもMVCパターンを処理する方法には適用されません、私は何を理解し、私の個人的な経験として:

  1. 対象http://www.w3.org/2001/tag/doc/whenToUseGet.htmlの良いと上品な1 thatsは、基本的には、取得するURLがコンテンツに対応している場合は取得する方法です。例では、保存する情報を渡すためにGETを使用しないでください。POSTを使用しないで、ユーザーに表示するコンテンツのIDを送信します。あなたはあなたのURLパターンが^[\w\d-]+([\d]+)$であることを知っていれば、/weird-article-slug-123と同じで、http://framework.zend.com/manual/en/zend.controller.router.htmlは基本的には/?id=123ではありません。

  2. いいえ、申し訳ありませんが、AJAXはJSを使用する方法に非常に似ていますので、AJAX関数はMVCバックエンドアプリケーションを利用することができます...同様に、そうです。この質問に答えるために確かに「無駄なリソース」になり

+0

私のクエストの答えはここにありませんか? – dqhendricks

+0

@dqhendricks ok - 基本的に... MVCを使って自分自身であなたのURLをどのように処理するのかはまったく関係ありません - 2つの主題がどうやってどうやっていくのかに関するベストプラクティスがあります – Hannes

1

Cfreak最良の方法は、あなたは彼らがMVCアプローチを実装しました方法を確認するために、様々なPHPフレームワークのソースコードにディグのためになります。私が使用したPHPフレームワークは、通常、GETデータを除外し、POSTデータに依存しています。しかし、情報は以下の例を参照してください。

通常、PHP MVCフレームワークのURLはexample.com/index.php/controller/action/argumentsのようになります。 index.phpの部分は通常、.htaccessファイルを使用して削除されます。あなたのコントローラは、親コントローラのクラスから継承される可能性が最も高いクラスです。コントローラーには、次に呼び出されることを好むアクション/メソッドがあります。これらのメソッドの引数は、URLにタックすることで、無制限の引数を渡すことができます。私はそれが構造の基本的な考えを与えるのに役立つことを願っています。すべてがあなたの必要な設定ファイルと必要なクラスとロードと必須クラスを含むindex.phpから始まります:

0

あなたは基本的にSEOに優しい(検索エンジン最適化に優しい)URLを達成する方法です「www.site.com/controller/action/params」の形式で入力します。これは、MOD_REWRITEを使用して、Webアプリケーションの共通アクセスポイントを取得するために、サーバーを指定されたフォルダにリダイレクトするために、いくつかの主要なフォルダ内の.htaccessファイルを編集することによって実現されます。私はこのtutorialを見ていきます。最初のいくつかの段落は、あなたが探しているURLを達成する方法を説明しています。

+0

私は彼らが行きたい場所にきれいなURLを指示するためにmodリライトを使用してください。問題は、どのようにGETメソッドのフォームを最初の場所でクリーンなURLにするかです。 – dqhendricks

2

URLを参照していることは、実際にはMVCとほとんど関係がありません。これはRESTアーキテクチャーの実装です。 (Wiki Article

セッションを使用する代わりに、各URLには、要求を作成するためにサーバーが必要とするすべての情報が含まれている必要があります。

これを行う方法はいくつかあります:

あなたは適切なGETパラメータにPATHを書き換えるためにはApacheのmod_rewriteを使用することができます。たとえば、あなたが通常でアクセスされたユーザ管理モジュールを持っていると言う:

http://your.domain/users.php?request=edit&id=<some id> 

あなたは、Apacheに置くことができます:

:その後、あなたと同じ要求に対処できるようになる

RewriteRule ^users\/edit\/(\d+) /users.php?request=edit&id=$1 

http://your.domain/users/edit/<some id> 

これは非常に簡単です(この仮定されたID番号である)へのreqのすべての場合あなたが発行すると期待されるものはかなりシンプルです。それらがより動的であれば、それをすべて設定するのが難しくなります。もう一つの欠点は、新しいフレームワークをリリースしたいのであれば、少なくとも.htaccessファイルを使ってApache設定を変更する必要があることです。それは常にそうであるとは限りません。

代わりにURLを解析できるコードに書き込みロジックがあります。この場合、通常、サイト全体の制御スクリプトが必要です。 URLは次のようなものになるだろう:あなたが見ることができるように

http://your.domain/users.php/edit/<some_id> 

<?php 

// get the part that appears after the script name 
$parts = explode("/", $_SERVER['PATH_INFO']); 

$request = $parts[1]; 
$id = $parts[2]; 

// do somethign with the $request and the $id 

?> 

、私の例では単純化ですが、オプション2で、それはあらゆる種類のものを行うにははるかに複雑なロジックを置くために簡単です。

希望に役立ちます。

+0

私はきれいなURLを指示する方法を知っています。問題は、きれいなURLとして提出するためのGETメソッドフォームをどのように取得するかです。 – dqhendricks

+0

@dqhendricks - 表示されないようにリダイレクトします。それが表示されないように書き換えるか、POSTを使用してください。彼らは「クリーンなURLとして送信できません」。あなたができるのは、それを隠すことだけです。 – Cfreak

+0

私のMVCでは常識的に$ _GET変数を使用していません。私は単に名前付きパラマタとしてそれらを渡します。したがって、私のURLは、 "GET"のような変数の場合、 "www.site.com/controller/action/param1/named:param"のようになります。コロンは、次の値に特定の名前があることを指定するために使用されます。私はその後、名前付き変数のすべてを保存するために、アプリケーション内のグローバル変数を設定します。 – JayD3e

6

あなたはこの
<のIfModule mod_rewrite.c >
            RewriteEngine            
にするRewriteCondの%{REQUEST_FILENAME}のような.htaccessファイルを使用することができます!
 を-d          するRewriteCond%{REQUEST_FILENAME}!-f
           はするRewriteRule ^(。*)$のindex.phpを?URL = $ 1 [QSA、L]
< /のIfModule >

そう... URLは、パスコントローラとアクションをすることができます
http://example.com/controller/action/param1/
ある場合、index.phpのは
のvar URL [文字列]を受け取り、あなたは、コントローラをロードするためにそれらを分割することができます...dqhendricksねえ

$params = explode('/', $_GET['url']); 
$controller = new $params[0];//load the controller 
$controller->$params[1]($params[2]);//ejecute the method, and pass the param 
+0

ありがとう、アミーゴ!それは私のために完璧に働いた。 – ppalancica

0

のような、 は、私はあなたが何をしているか、やややっている - 他のフレームワークを研究し、ゼロから1を作成することによって、MVCを学びます。

まず、フォームデータを処理するためにGETを使用しないでください。代わりにPOSTまたはPUTを使用してください。 POSTは、Webサービスから情報を取得するためにのみ使用されます。 GETのアクションを使用して、検索する情報(ソート順、ページなど)を操作できます。あなたのポイントについて

1)は、GETメソッドは

正しいを形成して使用しないでください。最初は、ある視点を得るためには、フォームを使わなければならないというのは間違っています。

2)

正確代わりフォーム送信のAJAXを使用します。あなたのフォームとURLは、JSの有無にかかわらず動作するはずです。

3)ポストメソッドを使用してページを投稿し、にしてから、ポストバースをURLにリフォームし、ヘッダを使用してそのURLにリロードします(無駄なリソースのようです)。

私はこれがリソースの無駄だとは言いません。あなたのアプリにはわずか1ミリ秒しかかかりません。実際、これはまさに私がやっていることです。フロントコントローラーがPOSTの使用を検出すると、フロントコントローラーはコントローラーにディスパッチして、送信されたデータに対して必要なアクションを実行します。結果に基づいて、appはクライアントをリダイレクトするか、要求されたページをレンダリングする(リダイレクトしない)。そして、はい、どんなURLでも同じように動作します。

同時に、特定のパラメータがURLに見つかった場合、Frontコントローラはそれぞれのコントローラにディスパッチします。しかし、決してデータを処理するために使用されることはありません。たとえば、モバイルブラウザでブラウズするときにwwwを使用する場合は、優先ドメイン(wwwまたはモバイル)を記憶するために使用されます。

また、IMOでは、リダイレクトする場所(HTTPクエリまたはPHPセッションでリダイレクトURLを渡す)を決定するAPPが無駄なリソースであると言えるでしょう。どちらの場合でも、代替メソッドを実装するには開発時間とサーバーリソースの両方が必要です。

私の意見では、そうです。

関連する問題