toma-stkのCakePHP自習室

2008-01-29basics.php - setUri() (CakePHP解析 #6)

前回、Configureクラスをもうちょっと突っ込んでと書いてしまいましたが、それほど良いネタがありませんでした。なので、予定を変更して「cake/bootstrap.php」に戻ってそのすぐ後に呼び出されている関数「setUri」を解析してみます。

setUri()

(※<?phpハイライトカラーを有効にするために記述しています)

<?php
function setUri() {
	if (env('HTTP_X_REWRITE_URL')) {
		$uri = env('HTTP_X_REWRITE_URL');
	} elseif (env('REQUEST_URI')) {
		$uri = env('REQUEST_URI');
	} else {
		if (env('argv')) {
			$uri = env('argv');

			if (defined('SERVER_IIS')) {
				$uri = BASE_URL . $uri[0];
			} else {
				$uri = env('PHP_SELF') . '/' . $uri[0];
			}
		} else {
			$uri = env('PHP_SELF') . '/' . env('QUERY_STRING');
		}
	}
	return $uri;
}
?>

簡単なif文のプログラムですね。

ポイントになるのは「env」が何を返しているかということでしょう。この「env」も「basics.php」内に定義されており、引数に応じて$_SERVERや$_ENVの値を返しています。

ここで、setUriはリクエストされたURIを環境に応じて返しているようです。環境というのは、「mod_rewriteを使える/使えない」とか「サーバーApacheIIS」とか。

$uriと$_GET['url']の値をセット

最終的に呼び出しもとの「bootstrap.php」で「?=」以降の値を$uri変数と$_GET['url']変数に格納しているようですね。

<?php
$uri = setUri();

if ($uri === '/' || $uri === '/index.php' || $uri === '/'.APP_DIR.'/') {
	$_GET['url'] = '/';
	$url = '/';
} else {
	if (strpos($uri, 'index.php') !== false) {
		$uri = r('?', '', $uri);
		$elements=explode('/index.php', $uri);
	} else {
		$elements = explode('/?', $uri);
	}

	if (!empty($elements[1])) {
		$_GET['url'] = $elements[1];
		$url = $elements[1];
	} else {
		$_GET['url'] = '/';
		$url = '/';
	}
}
?>

この後、$uriをコントローラー名、アクション名に分解していろいろやっていくんだろうなぁ。


次回は「cake/dispatcher.php」を解析する予定です。

ゲスト



トラックバック - http://studyroom.g.hatena.ne.jp/toma-stk/20080129