- 2010-03-15 (月) 16:45
- PHP
ルーティング処理を調査します。
ルーティングの設定によってURLの構成とロジックファイルの構成が変わってくるので重要な部分です。
以下のサイトをまず見てみましょう。ルーティング処理のチュートリアルみたいですね。
Url Routing with PHP – Part One
ダメな例から挙げていってなぜダメかを説明しながらブラッシュアップするチュートリアルみたいです。
まず、.htaccessから紹介しています。
Options +FollowSymLinks #1
IndexIgnore */* #2
# Turn on the RewriteEngine
RewriteEngine On #3
# Rules
RewriteCond %{REQUEST_FILENAME} !-f #4
RewriteCond %{REQUEST_FILENAME} !-d #5
RewriteRule . index.php #6
#1 FollowSymLinksはシンボリックリンクのリンク先に辿れることを許可します
#2 「IndexIgnore命令はディレクトリをリスト表示しているときに隠すためのファイルのリストに追加します」だそうです。ワイルドカードで/を囲むって意味はすべてのファイルってことなんですかね??
#3 「mod_rewriteを使用するという宣言」だそうです。
#4 存在するファイルがなかったらtrue(下の処理にいく) / あったらfalse
#5 存在するディレクトリがなかったらtrue(下の処理にいく) / あったらfalse
#6 すべてindex.phpを実行しろ
みたいな感じだと思いまぷ(汗
エントリポイントを作成していきましょう
エントリポイントとは起点となる処理を意味します。
単純なルーティングを設定してみましょう。URLをスラッシュで区切る方法です。
例1:www.example.com/command/parameter1/parameter2/
$requestURI = explode('/', $_SERVER['REQUEST_URI']);
Array ( [0] => [1] => command [2] => parameter1 [3] => parameter2 [4] => )
しかしこの例は、commandの前にディレクトリが一つでも噛んでいると正常に動作しません。(フロントコントローラ-ここではエントリポイントのこと-がルートディレクトリでないと正常に動作しません)
例えば、次のURL:www.example.com/myapps/app1/command/parameter1/parameter2/
(commandの前にapp1が入っている。)
この場合$requestURIは次のようになります。
Array ( [0] => [1] => myapps [2] => app1 [3] => command [4] => parameter1 [5] => parameter2 [6] => )
myappsとapp1が邪魔なのでこれを除去するためには$_SERVER['SCRIPT_NAME'] の変数が必要です。
$scriptName = explode('/',$_SERVER['SCRIPT_NAME']);
中身は
Array ( [0] => [1] => myapps[2] => app1 [3] => index.php )
以下が不要なURL(パスと実行スクリプト)を消去する処理です。
$requestURI = explode('/', $_SERVER['REQUEST_URI']);
$scriptName = explode('/',$_SERVER['SCRIPT_NAME']);
for($i= 0;$i < sizeof($scriptName);$i++)
{
if ($requestURI[$i] == $scriptName[$i])
{
unset($requestURI[$i]);
}
}
$command = array_values($requestURI);
以下が$commandの中身です。パスと実行スクリプトが失くなっています。
Array ( [0] => command [1] => parameter1 [2] => parameter2 [3] => )
実行コマンドを指定するスクリプトを書いてみましょう。
switch($command[0])
{
case 'commandOne' :
echo 'You entered command: '.$command[0];
break;
case 'commandTwo' :
echo 'You entered command: '.$command[0];
break;
default:
echo 'That command does not exist.';
break;
}
こんなんブサイク過ぎですね。次のチュートリアルで改善されたスクリプトがあるますのでご安心を。
以下に実際に振る舞うサンプルが紹介されています。examples.phpaddiction.com/urlrouter/part_1/
次のチュートリアルはルーティング処理をクラスにまとめて、名前空間を使用することをやります。
- Newer: フレームワークを作る ルーティング処理 調査編 その2
- Older: フレームワークを作る 初級者からの脱却 調査編
Comments:0
Trackbacks:1
- Trackback URL for this entry
- http://blog.cypher-works.com/wp-trackback.php?p=1123
- Listed below are links to weblogs that reference
- フレームワークを作る ルーティング処理 調査編 その1 from CYPHER-WORKS(コピペプログラマから書けるプログラマへ)
- pingback from CYPHER-WORKS(コピペプログラマから書けるプログラマへ) - フレームワークを作る ルーティング処理 調査編 その2 10-03-16 (火) 14:18
-
[...] Older [...]