3

Djangoや RoR に見られるような URL インタープリター/ディスパッチャーを PHP で実装する最良の方法は何ですか?

次のようにクエリ文字列を解釈できる必要があります。

  • /users/show/4にマップします
    • 面積利用者
    • アクション=ショー
    • ID = 4
  • /contents/list/20/10にマップします
    • エリア内容
    • アクション=リスト
    • 開始= 20
    • カウント= 10
  • /toggle/projects/10/activeにマップします
    • アクション=トグル
    • 面積=プロジェクト
    • ID = 10
    • フィールド=アクティブ

クエリ文字列は、指定された GET / POST 変数、またはインタープリターに渡される文字列にすることができます。

編集: mod_rewrite を使用しない実装を希望します。

編集: この質問はクリーン URL に関するものではなく、URL の解釈に関するものです。Drupal は mod_rewrite を使用して、 http://host/node/5などのリクエストをhttp://host/?q=node/5にリダイレクトします。次に、$_REQUEST['q'] の値を解釈します。私は通訳の部分に興味があります。

4

7 に答える 7

2

質問で説明しているのは、実際にはURLマッパーの部分である必要があります。そのためには、 Net_URL_Mapperと呼ばれるPEARパッケージを使用できます。そのクラスの使用方法に関する情報については、この単体テストを参照してください。

于 2008-11-29T22:29:06.710 に答える
2

なぜ特にmod_rewriteを使用したくないのですか?RoRはmod_rewriteを使用します。Djangoがこれをどのように行うかはわかりませんが、mod_phpはデフォルトでURLをファイルにマッピングするため、可能なURLごとに個別のPHPファイルを書き込むシステムを作成しない限り(メンテナンスの悪夢)、クリーンURLにはmod_rewriteを使用する必要があります。

于 2008-10-14T16:59:22.090 に答える
2

例として、cakephp の実装を見てください。

https://trac.cakephp.org/browser/trunk/cake/1.2.xx/cake/dispatcher.php

https://trac.cakephp.org/browser/trunk/cake/1.2.xx/cake/libs/router.php

mod_rewrite を使用して何かを行うこともできます。

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule ^(.*)$ $1 [L]
    RewriteRule ^([a-z]{2})/(.*)$ $2?lang=$1 [QSA,L]
    RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
</IfModule>

これは次のような URL をキャッチし、パラメータ「lang」と「url」を使用/en/foo /de/fooして index.php に渡します。GET「プロジェクト」、「アクション」などについても同様のことができます

于 2008-10-14T15:30:15.890 に答える
2

必要に応じて、MVC フレームワークに既に存在するものを使用できます。

Zend Framework、CakePHP、Symfony、Code Ignitor、Kohana、Solar、Akelos などのプロジェクト (順不同) をチェックしてください。

于 2008-10-14T15:00:32.003 に答える
1

私がこれを行う方法は非常に簡単です。
wordpress の .htaccess ファイルを使用します。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

この .htaccess が行うことは、何かが 404 を返したときに、ユーザーを index.php に送信することです。

上記の /index.php は、URL の「インタープリター」です。
index.php には、次のようなものがあります。

$req = $_SERVER['REQUEST_URI'];
$req = explode("/",$req);

2 行目は、「/」に基づいて URL をセクションに分割します。あなたが持つことができます

$area = $req['0'];
$action= $req['1'];
$id = $req['2'];

私がやっていることは次のとおりです。

function get_page($offset) {//offset is the chunk of URL we want to look at
    $req = $_SERVER['REQUEST_URI'];
    $req = explode("/",$req);
    $page = $req[$offset];
    return $page;
}
$area   = get_page(0);
$action = get_page(1);
$id     = get_page(2);  

お役に立てれば!

于 2008-10-15T02:54:18.317 に答える
0

@ Cheekysoftの提案の 2 番目として、Zend FrameworkのZend_Controllerコンポーネントを調べてください。これは、フレームワークの残りの部分から独立して使用できるフロント コントローラー パターンの実装です(完全な MVC フレームワークを使用したくない場合)。

そして明らかに、CakePHPは RoR スタイルに最も似ています。

于 2008-10-14T15:04:20.403 に答える
-2

私はあなたが説明していることを実行するPHPフレームワークを実行しています-Djangoが実行していることを取得し、それをPHPに取り込みます。これを現時点で解決する方法は、次のとおりです。

Djangoが持っているすてきでクリーンなRESTfulURL(http://example.com/do/this/and/that/_ )を取得するには、残念ながらmodを書き換える必要があります。ただし、スクリプトのファイル名を含むURI( http://example.com/index.php/do/this/and/that/)を使用してほぼ同じことを実現できるため、すべてが見た目ほど不機嫌ではありません。 。私のmodrewriteは、すべての呼び出しをその形式に転送するだけなので、modrewriteトリック_がない場合とほぼ同じように使用できます。_

正直なところ、私は現在GET(http://example.com/index.php?do/this/and/that/)で後者の方法を実行しており、本物のGET変数が渡された場合に備えて修正しています。 。しかし、私の最初の調査によると、ファイル名の後に直接スラッシュを使用する方がさらに簡単なはずです。特定のスーパーグローバルインデックスを使用してそれを掘り下げることができ$_SERVER、Apache構成を必要としません。手元にある正確なインデックスを思い出せませんが、テストページを簡単に実行して、phpinfo()内部でどのように見えるかを確認できます。

お役に立てれば。

于 2008-11-29T22:39:51.197 に答える