CakePHPでCMSっぽいものをつくって挫折するまでのコーディング日記(CakePHP修行 #1)
Tue, Jun 24, 2008今日から百式さんのCakePHP修行をパクってCakePHPでCMSっぽいものを作っていく日記を綴っていこうと思います。いままでやってきた例のカレンダーアプリがソースが継ぎはぎだらけだし、クラス名とか適当だしでgdgdになってしまったのでゼロから作り直します。ちゃんと百式さんみたくソースを晒していきます。
今日から百式さんのCakePHP修行をパクってCakePHPでCMSっぽいものを作っていく日記を綴っていこうと思います。いままでやってきた例のカレンダーアプリがソースが継ぎはぎだらけだし、クラス名とか適当だしでgdgdになってしまったのでゼロから作り直します。ちゃんと百式さんみたくソースを晒していきます。
前回、Configureクラスをもうちょっと突っ込んでと書いてしまいましたが、それほど良いネタがありませんでした。なので、予定を変更して「cake/bootstrap.php」に戻ってそのすぐ後に呼び出されている関数「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」とか。
最終的に呼び出しもとの「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/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クラスをもうちょっと突っ込んで解析してみたいと思います。