Home > CakePHP > CakePHP解析

CakePHP解析 Archive

dispatcher.php – $Route->parse【その壱】 (CakePHP解析 #7)

今回は「/cake/dispatcher.php」を解析してます。(めちゃめちゃ手強そう…)
このファイルはbootstrap.phpでrequireされた後に、「app/webroot/index.php」で
インスタンス化され、dispatchメソッドにURLリクエスト変数を渡しています。

$Dispatcher = new Dispatcher();
$Dispatcher->dispatch($url);

で、dispatcher.phpでは引数の$url変数をプライベートメソッドで何かしています。

$params = array_merge($this->parseParams($url), $additionalParams);

parseParams()メソッドの動きを追ってみます。
すると今度はRouteクラスのparseメソッドに引き渡されました。

$Route = new Router();
include CONFIGS.'routes.php';
$params = $Route->parse ($from_url);

しつこく、Routeクラスが定義されている「cake/libs/router.php」を追ってみます。
これまた、複雑そうな処理がずらずら出てきてしまいました。
なんか、面倒になってきたので一旦この辺で区切ろうと思います。

ちなみに適当なファイルに下記のような処理をほどこしたところ…

$Route = new Router();
include CONFIGS.'routes.php';
$params = $Route->parse ('users/login/aaaa/bbbb/cccc/dddd?a=A&b=B');

pr($params);    //結果出力

このような結果が返ってきました。

Array
(
    [pass] => Array
        (
            [0] => aaaa
            [1] => bbbb
            [2] => cccc
            [3] => dddd
        )
    [controller] => users
    [action] => login
)

次回は、更につっこんで解析してみます。

basics.php – setUri() (CakePHP解析 #6)

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

setUri()

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を使える/使えない」とか「サーバーがApache/IIS」とか。

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

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

$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」を解析する予定です。

cake/configure.php – 初期化 (CakePHP解析 #5)

前回の続きです。「cake/bootstrap.php」が「cake/configure.php」を読み込んでConfigureインスタンス(Singleton)を作っていますので、今日はこのConfigureインスタンスの動きをちょこっと解析。

bootstrap.phpから、&getInstanceメソッドが呼び出されていますね。このメソッドの中身は下記のとおり。

function &getInstance() {
	static $instance = array();
	if (!$instance) {
		$instance[0] =& new Configure;
		$instance[0]->__loadBootstrap();
	}
	return $instance[0];
}

PHP4のSingletonの挙動については、前回のエントリーで書いたので省略。ちょっと分からないのは、呼び出し元が次のようにしているところ。

$paths = Configure::getInstance();

「::」はインスタンス化無しでstaticなメソッドを実行ということなんだろうけど、PHP4の場合は戻り値の変数がstatic宣言されていれば、そのメソッドはstaticなメソッドでみなされるのかな?
うーん、よく分からん。次に進めちゃいます。

次は「__loadBootstrap()」ですが、これはConfigureクラスの一番下に定義されています。中身をみると自分で自分を初期化しているって感じかな。途中で「app/config/bootstrap.php」を読み込んでいますね。

この「app/config/bootstrap.php」ファイルはどうやら、作り手に対して「アプリケーション全体のグローバルな定数や関数を定義したり、または、それらが定義されているファイルを読み込みなよっ」て言っているんだと思います。

次回はConfigureクラスをもうちょっと突っ込んで解析してみたいと思います。

ホーム > CakePHP > CakePHP解析

検索
フィード
メタ
お城
STUDIO KINGDOM

Return to page top