<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>STUDIO KINGDOM &#187; CakePHP解析</title>
	<atom:link href="http://www.studio-kingdom.com/category/cakephp/cakephp_analysis/feed" rel="self" type="application/rss+xml" />
	<link>http://www.studio-kingdom.com</link>
	<description>PHPによるWebプログラミングやAdobeソフトによるWEBデザインなどなど</description>
	<lastBuildDate>Tue, 31 Mar 2009 15:37:13 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>basics.php &#8211; stripslashes_deep($value) (CakePHP解析 #10)</title>
		<link>http://www.studio-kingdom.com/cakephp/cakephp_analysis/138</link>
		<comments>http://www.studio-kingdom.com/cakephp/cakephp_analysis/138#comments</comments>
		<pubDate>Thu, 21 Aug 2008 13:54:31 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[CakePHP解析]]></category>

		<guid isPermaLink="false">http://www.studio-kingdom.com/?p=138</guid>
		<description><![CDATA[				今回はdispatcher.phpで呼び出されているstripslashes_deep関数を解析します。
				この関数はPHPのmagic_quotes_gpcがonの場合でも問題なく動作させるために使用され [...]]]></description>
			<content:encoded><![CDATA[				<p>今回はdispatcher.phpで呼び出されているstripslashes_deep関数を解析します。</p>
				<p>この関数はPHPのmagic_quotes_gpcがonの場合でも問題なく動作させるために使用されています。</p>
				<pre class="brush: php;">
if (ini_get('magic_quotes_gpc') == 1) {
    if (!empty($_POST)) {
        $params['form'] = stripslashes_deep($_POST);
    }
} else {
    $params['form'] = $_POST;
}
</pre>
				<p>ここで、magic_quotes_gpcがonの場合に、裏でどんな処理が行われるのかをおさらいしておきます。<br />
				マニュアルによると</p>
				<blockquote><p>
				オンの場合、全ての&#8217; (シングルクオート), &#8221; (ダブルクオート), \ (バックスラッシュ)および<br />
				NULL 文字がバックスラッシュで自動的にエスケープされます。 これは、addslashes() の機能と同じです。
				</p></blockquote>
				<p>つまり、「Is your name O&#8217;reilly?」は、「Is your name O\&#8217;reilly?」に自動的に変換されるわけです。<br />
				この変換処理はHTTPリクエストデータ(GET, POST, そして COOKIE)に対して行われます。</p>
				<p>そして、この変換されてしまったデータを元に戻すために使用されるのがstripslashes_deep()関数です。<br />
				この関数は「cake/basics.php」内に定義されています。</p>
				<pre class="brush: php;">
function stripslashes_deep($value) {
    if (is_array($value)) {
        $return = array_map('stripslashes_deep', $value);
        return $return;
    } else {
        $return = stripslashes($value);
        return $return ;
    }
}
</pre>
				<p>引数が配列で無い場合と、配列の場合で処理が分かれています。</p>
				<p>まずは配列で無い場合ですが、stripslashes関数で変換した値を返して終了しています。<br />
				stripslashes関数はmagic_quotes_gpcが行う変換処理の反対の変換を、つまり<br />
				「Is your name O\&#8217;reilly?」であれば、「Is your name O&#8217;reilly?」に変換します。</p>
				<p>次は配列の場合の処理を見てみます。</p>
				<p>まずarray_mapですが、これは第一引数で指定されている関数を、第二引数の配列の各値を引数にして呼び出す関数です。<br />
				ここでポイントになるのはarray_map内でstripslashes_deep関数を、つまり自分自身を関数内で呼び出している点です。<br />
				これは再帰関数と呼ばれるものになりますが、初めはなぜ「stripslashes」でなく「stripslashes_deep」を呼び出す必要があるのか疑問でした。<br />
				ただし、よくよく考えてみると配列の中身も配列、更にその中身も配列の可能性が…と考えると「なるほど再帰関数ってこういう<br />
				使い方をするのか」と感心してしまいました。</p>
				<p>この関数を作った人が関数名に「_deep」と付けたのもうなづけます。<br />
				再帰関数を理解するのにうってつけのお手本ではないでしょうか。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.studio-kingdom.com/cakephp/cakephp_analysis/138/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>dispatcher.php &#8211; $this-&gt;parseParams($url) (CakePHP解析 #9)</title>
		<link>http://www.studio-kingdom.com/cakephp/cakephp_analysis/136</link>
		<comments>http://www.studio-kingdom.com/cakephp/cakephp_analysis/136#comments</comments>
		<pubDate>Mon, 11 Aug 2008 13:51:49 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[CakePHP解析]]></category>

		<guid isPermaLink="false">http://www.studio-kingdom.com/?p=136</guid>
		<description><![CDATA[				今回は$Route-&#62;parseから戻ってparseParamsメソッドの解析をします。
				以前解析したように$Route-&#62;parse(&#8217;users/login/aaaa/bbbb [...]]]></description>
			<content:encoded><![CDATA[				<p>今回は$Route-&gt;parseから戻ってparseParamsメソッドの解析をします。</p>
				<p>以前解析したように$Route-&gt;parse(&#8217;users/login/aaaa/bbbb/cccc/dddd?a=A&amp;b=B&#8217;)の戻り値は<br />
				下記のような配列になります。</p>
				<pre>
Array
(
	[pass] =&gt; Array
	(
		[0] =&gt; aaaa
		[1] =&gt; bbbb
		[2] =&gt; cccc
		[3] =&gt; dddd
	)
	[controller] =&gt; users
	[action] =&gt; login
)
</pre>
				<p>この結果を$params変数が受け取っているわけですが、この$params変数は「$this-&gt;data」を保持する非常に重要な変数です。<br />
				下記のようにその後の処理でform値やurl値を取り込んでいます。</p>
				<pre class="brush: php;">
if (ini_get('magic_quotes_gpc') == 1) {
	if (!empty($_POST)) {
		$params['form'] = stripslashes_deep($_POST);
	}
} else {
	$params['form'] = $_POST;
}
</pre>
				<p>次回はこの処理の中で使用されている「stripslashes_deep」関数を解析します。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.studio-kingdom.com/cakephp/cakephp_analysis/136/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>dispatcher.php &#8211; $Route-&gt;parse【その弐】 (CakePHP解析 #8)</title>
		<link>http://www.studio-kingdom.com/cakephp/cakephp_analysis/134</link>
		<comments>http://www.studio-kingdom.com/cakephp/cakephp_analysis/134#comments</comments>
		<pubDate>Tue, 15 Jul 2008 13:48:38 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[CakePHP解析]]></category>

		<guid isPermaLink="false">http://www.studio-kingdom.com/?p=134</guid>
		<description><![CDATA[				今回は $Route->parseを更に解析する予定でしたが、正直何をしたいのかがいまいち分からない。どうやら$Routeオブジェクトの$routes配列にいろいろ突っ込んでいるようです。
				一体どんな値を [...]]]></description>
			<content:encoded><![CDATA[				<p>今回は $Route->parseを更に解析する予定でしたが、正直何をしたいのかがいまいち分からない。どうやら$Routeオブジェクトの$routes配列にいろいろ突っ込んでいるようです。</p>
				<p>一体どんな値を入れているのかだけ、出力して終了(>_<)<br />
				CakePHPのよく理解している人なら見当がつくのかな。</p>
				<pre>
Router Object
(
 [routes] => Array
  (
   [0] => Array
    (
     [0] => /
     [1] => /^[\/]*$/
     [2] => Array
      (
      )

     [3] => Array
      (
       [controller] => schedules
       [action] => index
      )
    )

   [1] => Array
    (
     [0] => /pages/*
     [1] => #^/pages(?:\/(.*))?[\/]*$#
     [2] => Array
      (
      )
     [3] => Array
      (
       [controller] => pages
       [action] => display
      )
    )

   [2] => Array
    (
     [0] => /tests
     [1] => #^/tests[\/]*$#
     [2] => Array
      (
      )
     [3] => Array
      (
       [controller] => tests
       [action] => index
      )
    )

   [3] => Array
    (
     [0] => /bare/:controller/:action/*
     [1] => #^/bare(?:\/([^\/]+))?(?:\/([^\/]+))?(?:\/(.*))?[\/]*$#
     [2] => Array
      (
       [0] => controller
       [1] => action
      )
     [3] => Array
      (
       [bare] => 1
      )
    )

   [4] => Array
    (
     [0] => /ajax/:controller/:action/*
     [1] => #^/ajax(?:\/([^\/]+))?(?:\/([^\/]+))?(?:\/(.*))?[\/]*$#
     [2] => Array
      (
       [0] => controller
       [1] => action
      )
     [3] => Array
      (
       [bare] => 1
      )
    )

   [5] => Array
    (
     [0] => /:controller/:action/* (default)
     [1] => /^(?:\/(?:([a-zA-Z0-9_\-\.\;\:]+)(?:\/([a-zA-Z0-9_\-\.\;\:]+)(?:[\/\?](.*))?)?))[\/]*$/
     [2] => Array
      (
       [0] => controller
       [1] => action
      )
     [3] => Array
      (
      )
    )
  )

 [__admin] =>
 [_log] =>
)
</pre>
				<p>追記<br />
				$route配列をよくよく観察してみると、CakePHPの遷移処理を管理しているように見えますね。<br />
				下記の例だと</p>
				<pre>
[0] => /
[1] => /^[\/]*$/
[2] => Array
    (
    )
[3] => Array
    (
        [controller] => schedules
        [action] => index
    )
</pre>
				<p>おそらく[0]がルートパスを表していて、[1]が遷移に関する正規表現？、[2]はひとまず置いといて<br />
				[3]は実行するコントローラーとアクション。</p>
				<p>[1]の正規表現は何を意味しているんだろう？<br />
				「/^[\/]*$/」にマッチするのって「/」とか「///」みたいに、ひたすらスラッシュの文字列だけのように思うんだけど。<br />
				もう少しCakePHP理解しないと、分からないかな。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.studio-kingdom.com/cakephp/cakephp_analysis/134/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>dispatcher.php &#8211; $Route-&gt;parse【その壱】 (CakePHP解析 #7)</title>
		<link>http://www.studio-kingdom.com/cakephp/cakephp_analysis/132</link>
		<comments>http://www.studio-kingdom.com/cakephp/cakephp_analysis/132#comments</comments>
		<pubDate>Sat, 05 Jul 2008 13:45:10 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[CakePHP解析]]></category>

		<guid isPermaLink="false">http://www.studio-kingdom.com/?p=132</guid>
		<description><![CDATA[				今回は「/cake/dispatcher.php」を解析してます。（めちゃめちゃ手強そう…）
				このファイルはbootstrap.phpでrequireされた後に、「app/webroot/index.ph [...]]]></description>
			<content:encoded><![CDATA[				<p>今回は「/cake/dispatcher.php」を解析してます。（めちゃめちゃ手強そう…）<br />
				このファイルはbootstrap.phpでrequireされた後に、「app/webroot/index.php」で<br />
				インスタンス化され、dispatchメソッドにURLリクエスト変数を渡しています。</p>
				<pre class="brush: php;">
$Dispatcher = new Dispatcher();
$Dispatcher-&gt;dispatch($url);
</pre>
				<p>で、dispatcher.phpでは引数の$url変数をプライベートメソッドで何かしています。</p>
				<pre class="brush: php;">
$params = array_merge($this-&gt;parseParams($url), $additionalParams);
</pre>
				<p>parseParams()メソッドの動きを追ってみます。<br />
				すると今度はRouteクラスのparseメソッドに引き渡されました。</p>
				<pre class="brush: php;">
$Route = new Router();
include CONFIGS.'routes.php';
$params = $Route-&gt;parse ($from_url);
</pre>
				<p>しつこく、Routeクラスが定義されている「cake/libs/router.php」を追ってみます。<br />
				これまた、複雑そうな処理がずらずら出てきてしまいました。<br />
				なんか、面倒になってきたので一旦この辺で区切ろうと思います。</p>
				<p>ちなみに適当なファイルに下記のような処理をほどこしたところ…</p>
				<pre class="brush: php;">
$Route = new Router();
include CONFIGS.'routes.php';
$params = $Route-&gt;parse ('users/login/aaaa/bbbb/cccc/dddd?a=A&amp;amp;b=B');

pr($params);    //結果出力
</pre>
				<p>このような結果が返ってきました。</p>
				<pre>
Array
(
    [pass] => Array
        (
            [0] => aaaa
            [1] => bbbb
            [2] => cccc
            [3] => dddd
        )
    [controller] => users
    [action] => login
)
</pre>
				<p>次回は、更につっこんで解析してみます。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.studio-kingdom.com/cakephp/cakephp_analysis/132/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>basics.php &#8211; setUri()  (CakePHP解析 #6)</title>
		<link>http://www.studio-kingdom.com/cakephp/cakephp_analysis/130</link>
		<comments>http://www.studio-kingdom.com/cakephp/cakephp_analysis/130#comments</comments>
		<pubDate>Sat, 21 Jun 2008 13:36:16 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[CakePHP解析]]></category>

		<guid isPermaLink="false">http://www.studio-kingdom.com/?p=130</guid>
		<description><![CDATA[				前回、Configureクラスをもうちょっと突っ込んでと書いてしまいましたが、それほど良いネタがありませんでした。なので、予定を変更して「cake/bootstrap.php」に戻ってそのすぐ後に呼び出されている [...]]]></description>
			<content:encoded><![CDATA[				<p>前回、Configureクラスをもうちょっと突っ込んでと書いてしまいましたが、それほど良いネタがありませんでした。なので、予定を変更して「cake/bootstrap.php」に戻ってそのすぐ後に呼び出されている関数「setUri」を解析してみます。</p>
				<h3>setUri()</h3>
				<pre class="brush: 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;
}
</pre>
				<p>簡単なif文のプログラムですね。<br />
				ポイントになるのは「env」が何を返しているかということでしょう。この「env」も「basics.php」内に定義されており、引数に応じて$_SERVERや$_ENVの値を返しています。</p>
				<p>ここで、setUriはリクエストされたURIを環境に応じて返しているようです。環境というのは、「mod_rewriteを使える／使えない」とか「サーバーがApache／IIS」とか。</p>
				<h3>$uriと$_GET['url']の値をセット</h3>
				<p>最終的に呼び出しもとの「bootstrap.php」で「?=」以降の値を$uri変数と$_GET['url']変数に格納しているようですね。</p>
				<pre class="brush: 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 = '/';
	}
}
</pre>
				<p>この後、$uriをコントローラー名、アクション名に分解していろいろやっていくんだろうなぁ。</p>
				<p>次回は「cake/dispatcher.php」を解析する予定です。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.studio-kingdom.com/cakephp/cakephp_analysis/130/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>cake/configure.php &#8211; 初期化  (CakePHP解析 #5)</title>
		<link>http://www.studio-kingdom.com/cakephp/cakephp_analysis/127</link>
		<comments>http://www.studio-kingdom.com/cakephp/cakephp_analysis/127#comments</comments>
		<pubDate>Thu, 12 Jun 2008 13:32:01 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[CakePHP解析]]></category>

		<guid isPermaLink="false">http://www.studio-kingdom.com/?p=127</guid>
		<description><![CDATA[				前回の続きです。「cake/bootstrap.php」が「cake/configure.php」を読み込んでConfigureインスタンス(Singleton)を作っていますので、今日はこのConfigureイ [...]]]></description>
			<content:encoded><![CDATA[				<p>前回の続きです。「cake/bootstrap.php」が「cake/configure.php」を読み込んでConfigureインスタンス(Singleton)を作っていますので、今日はこのConfigureインスタンスの動きをちょこっと解析。</p>
				<p>bootstrap.phpから、&amp;getInstanceメソッドが呼び出されていますね。このメソッドの中身は下記のとおり。</p>
				<pre class="brush: php;">
function &amp;getInstance() {
	static $instance = array();
	if (!$instance) {
		$instance[0] =&amp; new Configure;
		$instance[0]-&gt;__loadBootstrap();
	}
	return $instance[0];
}
</pre>
				<p>PHP4のSingletonの挙動については、前回のエントリーで書いたので省略。ちょっと分からないのは、呼び出し元が次のようにしているところ。</p>
				<pre class="brush: php;">
$paths = Configure::getInstance();
</pre>
				<p>「::」はインスタンス化無しでstaticなメソッドを実行ということなんだろうけど、PHP4の場合は戻り値の変数がstatic宣言されていれば、そのメソッドはstaticなメソッドでみなされるのかな？<br />
				うーん、よく分からん。次に進めちゃいます。</p>
				<p>次は「__loadBootstrap()」ですが、これはConfigureクラスの一番下に定義されています。中身をみると自分で自分を初期化しているって感じかな。途中で「app/config/bootstrap.php」を読み込んでいますね。</p>
				<p>この「app/config/bootstrap.php」ファイルはどうやら、作り手に対して「アプリケーション全体のグローバルな定数や関数を定義したり、または、それらが定義されているファイルを読み込みなよっ」て言っているんだと思います。</p>
				<p>次回はConfigureクラスをもうちょっと突っ込んで解析してみたいと思います。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.studio-kingdom.com/cakephp/cakephp_analysis/127/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Configureクラスとシングルトン (CakePHP解析 #4)</title>
		<link>http://www.studio-kingdom.com/cakephp/cakephp_analysis/125</link>
		<comments>http://www.studio-kingdom.com/cakephp/cakephp_analysis/125#comments</comments>
		<pubDate>Thu, 05 Jun 2008 13:12:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[CakePHP解析]]></category>

		<guid isPermaLink="false">http://www.studio-kingdom.com/?p=125</guid>
		<description><![CDATA[				本日は「bootstrap.php」の解析ですが、このファイルはCakePHPのかなり重要な部分な感じがします。
				ちょこっとずつ進めていきます。
				まずは↓から。
				
require LIBS [...]]]></description>
			<content:encoded><![CDATA[				<p>本日は「bootstrap.php」の解析ですが、このファイルはCakePHPのかなり重要な部分な感じがします。<br />
				ちょこっとずつ進めていきます。</p>
				<p>まずは↓から。</p>
				<pre class="brush: php;">
require LIBS . 'configure.php';
$paths = Configure::getInstance();
</pre>
				<p>cake/libs内のconfigure.phpを読み込んだ後、インスタンスを取得しています。getInstance()から、Singleton（シングルトン）であることが分かります。PHP4のシングルトンの解説は下記のサイトが分かりやすいです。</p>
				<p><a href="http://www.doyouphp.jp/sample/sample_class_dp_singleton.shtml" target="blank">PHP4でデザインパターン（Singleton編）</a></p>
				<p>また、&amp;getInstance()メソッドの「&amp;」や「&amp;=」の意味は「てくめも@coop」さんのサイトに解説が載っています。</p>
				<p><a href="http://www.ecoop.net/memo/2007-10-22-1.html" blank="_blank">PHP4 と PHP5 の Sigleton Pattern</a></p>
				<blockquote><p>
				ソッド定義とメソッド呼び出しの両方に &amp; を付けないと、参照でなくコピーになってしまい…
				</p></blockquote>
				<p>今日はあまり時間がないので、ここまでorz</p>
				<p>次回はbootstrap.phpが「Configure」インスタンスで何をしているのか解析したいと思います。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.studio-kingdom.com/cakephp/cakephp_analysis/125/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>/app/webroot/.htaccess(CakePHP解析 #3)</title>
		<link>http://www.studio-kingdom.com/cakephp/cakephp_analysis/114</link>
		<comments>http://www.studio-kingdom.com/cakephp/cakephp_analysis/114#comments</comments>
		<pubDate>Tue, 20 May 2008 12:49:41 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[CakePHP解析]]></category>

		<guid isPermaLink="false">http://www.studio-kingdom.com/?p=114</guid>
		<description><![CDATA[				今回は「/app/webroot/.htaccess」を解析します。
				ソースは下記のとおり。
				&#60;IfModule mod_rewrite.c&#62;
	RewriteEngine On
	R [...]]]></description>
			<content:encoded><![CDATA[				<p>今回は「/app/webroot/.htaccess」を解析します。<br />
				ソースは下記のとおり。</p>
				<pre>&lt;IfModule mod_rewrite.c&gt;
	RewriteEngine On
	RewriteCond %{REQUEST_FILENAME} !-d
	RewriteCond %{REQUEST_FILENAME} !-f
	RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
	&lt;/IfModule&gt;
</pre>
				<h3>RewriteCond</h3>
				<p>RewriteCondはURLをRewriteする条件になります。<br />
				「%{REQUEST_FILENAME}」は「要求したファイル名(フォルダ名)が」という意味。<br />
				URL指定で、「/app/webroot/aaa」ならば「aaa」がそれに当たります。<br />
				そして「!-d」は、この例であれば「aaa」というフォルダが存在するのであればRewriteしない。「!-f」はファイルが存在するのであればRewriteしないということになります。<br />
				この処理については、phaさんが自習室で詳しくまとめられています。</p>
				<p><a href="http://studyroom.g.hatena.ne.jp/pha/20070511/p1" target="_blank">RewriteRuleをいろいろ試す会：RewriteCondを使う</a></p>
				<h3>QSAとは？</h3>
				<p>次にRewriteRule ^(.*)$ index.php?url=$1 [QSA,L]ですが、<br />
				URL書き換え部分は(.*)が$1に書き換わります。<br />
				「/app/webroot/aaa」でアクセスしたら、「/app/webroot/index.php?url=aaa」となります。<br />
				後にくっついている[QSA,L]の「QSA」の意味ですが、とみぞーノートさんのサイトに詳しくまとめられています。</p>
				<p><a href="http://wiki.bit-hive.com/tomizoo/pg/mod_rewrite%20-%20QSA%A5%D5%A5%E9%A5%B0" target="_blank">mod_rewrite &#8211; QSAフラグ</a></p>
				<p>次回は「cake/bootstrap.php」を解説したいと思います。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.studio-kingdom.com/cakephp/cakephp_analysis/114/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>/.htaccess(CakePHP解析 #2)</title>
		<link>http://www.studio-kingdom.com/cakephp/cakephp_analysis/112</link>
		<comments>http://www.studio-kingdom.com/cakephp/cakephp_analysis/112#comments</comments>
		<pubDate>Mon, 12 May 2008 03:06:33 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[CakePHP解析]]></category>

		<guid isPermaLink="false">http://www.studio-kingdom.com/?p=112</guid>
		<description><![CDATA[				前回は「app/webroot/index.php」から学習をスタートしましたが、じゃぁ「index.php」や「app/index.php」どうなっているのかと言いますと.htaccessによってシカトされてま [...]]]></description>
			<content:encoded><![CDATA[				<p>前回は「app/webroot/index.php」から学習をスタートしましたが、じゃぁ「index.php」や「app/index.php」どうなっているのかと言いますと.htaccessによってシカトされてますね。おそらくmod_rewriteが使えない場合の対策なのでしょうが、その場合の処理まで解析していてはキリがありません。今日は最上層にある/.htaccessの解析をします。</p>
				<p>/.htaccess（app/.htaccessもほぼ同じ内容）</p>
				<pre>
&lt;IfModule mod_rewrite.c&gt;
   RewriteEngine on
   RewriteRule    ^$ app/webroot/    [L]
   RewriteRule    (.*) app/webroot/$1 [L]
&lt;/IfModule&gt;
</pre>
				<h3>&lt;IfModule mod_rewrite.c&gt;～&lt;/IfModule&gt;</h3>
				<p>まずは、&lt;IfModule mod_rewrite.c&gt;～&lt;/IfModule&gt;ですが、これはmod_rewriteモジュールが有効かどうか調べて、有効であれば中身の処理を実行するという意味です。</p>
				<h3>RewriteEngine on以下</h3>
				<p>次に中身の解説ですが、こちらの技林さんのサイトの解説が凄く分かりやすいです。この処理でapp/webroot/に飛ばしているわけですね。<br />
				<a href="http://tech.bayashi.net/svr/doc/apache/mod_rewrite.html" target="_blank">mod_rewrite</a></p>
				<h3>正規表現は欠かせません</h3>
				<p>また、mod_rewriteを知る上で正規表現の知識は欠かせません。自分の正規表現入門お薦めサイトはこちらのサイトです。<br />
				<a href="http://www.mnet.ne.jp/~nakama/" target="_blank">サルにもわかる正規表現入門</a></p>
				<p>更に正規表現を理解したい人はやはり「フクロウ本」を読むことをお奨めします。</p>
				<div class="amazlet-box" style="margin-bottom:0px;">
				<div class="amazlet-image" style="float:left;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4873113598/studiokingdom-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51cRxtwo7IL._SL160_.jpg" alt="詳説 正規表現 第3版" style="border: none;" /></a></div>
				<div class="amazlet-info" style="float:left;margin-left:15px;line-height:120%">
				<div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4873113598/studiokingdom-22/ref=nosim/" name="amazletlink" target="_blank">詳説 正規表現 第3版</a>
				<div class="amazlet-powered-date" style="font-size:7pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/4873113598/studiokingdom-22/ref=nosim/" title="詳説 正規表現 第3版" target="_blank">amazlet</a> at 08.09.21</div>
				</div>
				<div class="amazlet-detail">Jeffrey E.F. Friedl <br />オライリージャパン <br />売り上げランキング: 32534</div>
				<div class="amazlet-review" style="margin-top:10px; margin-bottom:10px">
				<div class="amazlet-review-average" style="margin-bottom:5px">おすすめ度の平均: <img src="http://images-jp.amazon.com/images/G/09/x-locale/common/customer-reviews/stars-5-0.gif" alt="5.0" /></div>
				<p><img src="http://images-jp.amazon.com/images/G/09/x-locale/common/customer-reviews/stars-5-0.gif" alt="5" /> 正規表現を確実にマスターできる<br /><img src="http://images-jp.amazon.com/images/G/09/x-locale/common/customer-reviews/stars-5-0.gif" alt="5" /> DOSのコマンドのような簡単なものから</div>
				<div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4873113598/studiokingdom-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div>
				</div>
				<div class="amazlet-footer" style="clear: left"></div>
				</div>
				<h3>[L]って何？</h3>
				<p>これまた、技林さんのサイトの解説が分かりやすいです。</p>
				<p><a href="http://tech.bayashi.jp/archives/entry/techweb/2007/001981.html" target="_blank">mod_rewrite サンプル集</a></p>
				<p>[L]を指定している所でマッチしたら、それ以降のマッチング処理をしないということですね。</p>
				<h3>(.*) app/webroot/$1だけで良くね？</h3>
				<p>と思って、ローカル環境で^$ app/webroot/を外して試してみましたが普通に動きました。うーん、でもやっぱ何かしらの理由があるんだろうな…。誰か分かる方いらっしゃいましたら教えてください(><)</p>
				<p>次のエントリーでは「app/webroot/.htaccess」を解説したいと思います。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.studio-kingdom.com/cakephp/cakephp_analysis/112/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>app/webroot/index.php(CakePHP解析 #1)</title>
		<link>http://www.studio-kingdom.com/cakephp/cakephp_analysis/110</link>
		<comments>http://www.studio-kingdom.com/cakephp/cakephp_analysis/110#comments</comments>
		<pubDate>Mon, 05 May 2008 02:30:55 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[CakePHP解析]]></category>

		<guid isPermaLink="false">http://www.studio-kingdom.com/?p=110</guid>
		<description><![CDATA[				はてな自習室から、こっちへ移動。CakePHPを解析しつつPHPとCakePHPを勉強をしています。
				まずは「app/webroot/index.php」からですが、ここで肝になるのは『include_p [...]]]></description>
			<content:encoded><![CDATA[				<p>はてな自習室から、こっちへ移動。CakePHPを解析しつつPHPとCakePHPを勉強をしています。<br />
				まずは「app/webroot/index.php」からですが、ここで肝になるのは『include_path』ではないでしょうか。</p>
				<pre class="brush: php;">
if (!defined('CORE_PATH')) {
	if (function_exists('ini_set')) {
		ini_set('include_path',
 CAKE_CORE_INCLUDE_PATH . PATH_SEPARATOR . ROOT . DS .
 APP_DIR . DS . PATH_SEPARATOR . ini_get('include_path'));
		define('APP_PATH', null);
		define('CORE_PATH', null);
	} else {
		define('APP_PATH', ROOT . DS . APP_DIR . DS);
		define('CORE_PATH', CAKE_CORE_INCLUDE_PATH . DS);
	}
}
</pre>
				<p>で、include_pathってなんぞや？ってなるわけですが、こちらのデジットさんの説明がとっても分かりやすいです。</p>
				<p><a href="http://digit-01.com/ownpage/php_include_path.html">デジットさんのPHPのinclude_path</a></p>
				<p>ここが重要ですね。探す順番。</p>
				<blockquote><p>
				PHP実行ファイルからrequire()、include()等で読み出されるファイルは、次の順番で探されます。</p>
				<p>   1. include_pathで設定されているディレクトリ<br />
				   2. 実行しているファイルのあるディレクトリ<br />
				   3. ./ 又は ../ で始まっている場合は、 実行しているファイルのあるディレクトリからの相対パス</p>
				<p>更に、require()、include()されたファイル（例えば「inc.php」）の中にrequire()、include()がある場合は、当然上記のディレクトリを探した後に「inc.php」ファイルがあるディレクトリも探します。
				</p></blockquote>
				<p>自分の環境で「var_dump(ini_get(&#8217;include_path&#8217;));」としてみたところ次のように出力されました。</p>
				<blockquote><p>
				string(57) &#8220;C:\www\schedule;C:\www\schedule\app\;.;C:\xampp\php\pear\&#8221;
				</p></blockquote>
				<p>CakePHPのフォルダを配置した場所が「C:\www\schedule」なので、CakePHPのルートに当たるディレクトリとその下層の「app」フォルダがinclude_pathに追加されたようです。ちなみに「.;C:\xampp\php\pear\」はphp.iniファイルに設定されていました。</p>
				<p>このinclude_pathの設定により、requireやincludeでいちいち相対パスを指定する必要が無くなるわけですね。include_pathの概念がよく分かってなかったので早速勉強になりました。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.studio-kingdom.com/cakephp/cakephp_analysis/110/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
