<?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、javaScriptによるプログラミングやAdobeソフトによるWEBデザインなどなど</description>
	<lastBuildDate>Tue, 29 Nov 2011 14:01:00 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<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の場合でも問題なく動作させるために使用されています。 [s [...]]]></description>
			<content:encoded><![CDATA[				<p>今回はdispatcher.phpで呼び出されているstripslashes_deep関数を解析します。</p>
				<p>この関数はPHPのmagic_quotes_gpcがonの場合でも問題なく動作させるために使用されています。</p>
				<p>[sourcecode language='php']<br />
				if (ini_get(&#8216;magic_quotes_gpc&#8217;) == 1) {<br />
				    if (!empty($_POST)) {<br />
				        $params['form'] = stripslashes_deep($_POST);<br />
				    }<br />
				} else {<br />
				    $params['form'] = $_POST;<br />
				}<br />
				[/sourcecode]</p>
				<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>
				<p>[sourcecode language='php']<br />
				function stripslashes_deep($value) {<br />
				    if (is_array($value)) {<br />
				        $return = array_map(&#8216;stripslashes_deep&#8217;, $value);<br />
				        return $return;<br />
				    } else {<br />
				        $return = stripslashes($value);<br />
				        return $return ;<br />
				    }<br />
				}<br />
				[/sourcecode]</p>
				<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(&#8216;users/login/aaaa/bbbb/cccc/dd [...]]]></description>
			<content:encoded><![CDATA[				<p>今回は$Route-&gt;parseから戻ってparseParamsメソッドの解析をします。</p>
				<p>以前解析したように$Route-&gt;parse(&#8216;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>
				<p>[sourcecode language='php']<br />
				if (ini_get(&#8216;magic_quotes_gpc&#8217;) == 1) {<br />
					if (!empty($_POST)) {<br />
						$params['form'] = stripslashes_deep($_POST);<br />
					}<br />
				} else {<br />
					$params['form'] = $_POST;<br />
				}<br />
				[/sourcecode]</p>
				<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.php」で インスタ [...]]]></description>
			<content:encoded><![CDATA[				<p>今回は「/cake/dispatcher.php」を解析してます。（めちゃめちゃ手強そう…）<br />
				このファイルはbootstrap.phpでrequireされた後に、「app/webroot/index.php」で<br />
				インスタンス化され、dispatchメソッドにURLリクエスト変数を渡しています。</p>
				<p>[sourcecode language='php']<br />
				$Dispatcher = new Dispatcher();<br />
				$Dispatcher->dispatch($url);<br />
				[/sourcecode]</p>
				<p>で、dispatcher.phpでは引数の$url変数をプライベートメソッドで何かしています。</p>
				<p>[sourcecode language='php']<br />
				$params = array_merge($this->parseParams($url), $additionalParams);<br />
				[/sourcecode]</p>
				<p>parseParams()メソッドの動きを追ってみます。<br />
				すると今度はRouteクラスのparseメソッドに引き渡されました。</p>
				<p>[sourcecode language='php']<br />
				$Route = new Router();<br />
				include CONFIGS.&#8217;routes.php&#8217;;<br />
				$params = $Route->parse ($from_url);<br />
				[/sourcecode]</p>
				<p>しつこく、Routeクラスが定義されている「cake/libs/router.php」を追ってみます。<br />
				これまた、複雑そうな処理がずらずら出てきてしまいました。<br />
				なんか、面倒になってきたので一旦この辺で区切ろうと思います。</p>
				<p>ちなみに適当なファイルに下記のような処理をほどこしたところ…</p>
				<p>[sourcecode language='php']<br />
				$Route = new Router();<br />
				include CONFIGS.&#8217;routes.php&#8217;;<br />
				$params = $Route->parse (&#8216;users/login/aaaa/bbbb/cccc/dddd?a=A&amp;b=B&#8217;);</p>
				<p>pr($params);    //結果出力<br />
				[/sourcecode]</p>
				<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」に戻ってそのすぐ後に呼び出されている関数「s [...]]]></description>
			<content:encoded><![CDATA[				<p>前回、Configureクラスをもうちょっと突っ込んでと書いてしまいましたが、それほど良いネタがありませんでした。なので、予定を変更して「cake/bootstrap.php」に戻ってそのすぐ後に呼び出されている関数「setUri」を解析してみます。</p>
				<h3>setUri()</h3>
				<p>[sourcecode language='php']<br />
				function setUri() {<br />
					if (env(&#8216;HTTP_X_REWRITE_URL&#8217;)) {<br />
						$uri = env(&#8216;HTTP_X_REWRITE_URL&#8217;);<br />
					} elseif (env(&#8216;REQUEST_URI&#8217;)) {<br />
						$uri = env(&#8216;REQUEST_URI&#8217;);<br />
					} else {<br />
						if (env(&#8216;argv&#8217;)) {<br />
							$uri = env(&#8216;argv&#8217;);</p>
				<p>			if (defined(&#8216;SERVER_IIS&#8217;)) {<br />
								$uri = BASE_URL . $uri[0];<br />
							} else {<br />
								$uri = env(&#8216;PHP_SELF&#8217;) . &#8216;/&#8217; . $uri[0];<br />
							}<br />
						} else {<br />
							$uri = env(&#8216;PHP_SELF&#8217;) . &#8216;/&#8217; . env(&#8216;QUERY_STRING&#8217;);<br />
						}<br />
					}<br />
					return $uri;<br />
				}<br />
				[/sourcecode]</p>
				<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>
				<p>[sourcecode language='php']<br />
				$uri = setUri();</p>
				<p>if ($uri === &#8216;/&#8217; || $uri === &#8216;/index.php&#8217; || $uri === &#8216;/&#8217;.APP_DIR.&#8217;/') {<br />
					$_GET['url'] = &#8216;/&#8217;;<br />
					$url = &#8216;/&#8217;;<br />
				} else {<br />
					if (strpos($uri, &#8216;index.php&#8217;) !== false) {<br />
						$uri = r(&#8216;?&#8217;, &#8221;, $uri);<br />
						$elements=explode(&#8216;/index.php&#8217;, $uri);<br />
					} else {<br />
						$elements = explode(&#8216;/?&#8217;, $uri);<br />
					}</p>
				<p>	if (!empty($elements[1])) {<br />
						$_GET['url'] = $elements[1];<br />
						$url = $elements[1];<br />
					} else {<br />
						$_GET['url'] = &#8216;/&#8217;;<br />
						$url = &#8216;/&#8217;;<br />
					}<br />
				}<br />
				[/sourcecode]</p>
				<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>
				<p>[sourcecode language='php']<br />
				function &#038;getInstance() {<br />
					static $instance = array();<br />
					if (!$instance) {<br />
						$instance[0] =&#038; new Configure;<br />
						$instance[0]->__loadBootstrap();<br />
					}<br />
					return $instance[0];<br />
				}<br />
				[/sourcecode]</p>
				<p>PHP4のSingletonの挙動については、前回のエントリーで書いたので省略。ちょっと分からないのは、呼び出し元が次のようにしているところ。</p>
				<p>[sourcecode language='php']<br />
				$paths = Configure::getInstance();<br />
				[/sourcecode]</p>
				<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のかなり重要な部分な感じがします。 ちょこっとずつ進めていきます。 まずは↓から。 [sourcecode language='php'] r [...]]]></description>
			<content:encoded><![CDATA[				<p>本日は「bootstrap.php」の解析ですが、このファイルはCakePHPのかなり重要な部分な感じがします。<br />
				ちょこっとずつ進めていきます。</p>
				<p>まずは↓から。<br />
				[sourcecode language='php']<br />
				require LIBS . &#8216;configure.php&#8217;;<br />
				$paths = Configure::getInstance();<br />
				[/sourcecode]</p>
				<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 RewriteCond %{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_path』ではない [...]]]></description>
			<content:encoded><![CDATA[				<p>はてな自習室から、こっちへ移動。CakePHPを解析しつつPHPとCakePHPを勉強をしています。<br />
				まずは「app/webroot/index.php」からですが、ここで肝になるのは『include_path』ではないでしょうか。</p>
				<p>[sourcecode language='php']<br />
				if (!defined(&#8216;CORE_PATH&#8217;)) {<br />
					if (function_exists(&#8216;ini_set&#8217;)) {<br />
						ini_set(&#8216;include_path&#8217;,<br />
				 CAKE_CORE_INCLUDE_PATH . PATH_SEPARATOR . ROOT . DS .<br />
				 APP_DIR . DS . PATH_SEPARATOR . ini_get(&#8216;include_path&#8217;));<br />
						define(&#8216;APP_PATH&#8217;, null);<br />
						define(&#8216;CORE_PATH&#8217;, null);<br />
					} else {<br />
						define(&#8216;APP_PATH&#8217;, ROOT . DS . APP_DIR . DS);<br />
						define(&#8216;CORE_PATH&#8217;, CAKE_CORE_INCLUDE_PATH . DS);<br />
					}<br />
				}<br />
				[/sourcecode]</p>
				<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(&#8216;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>

