Configureクラスとシングルトン (CakePHP解析 #4)

本日は「bootstrap.php」の解析ですが、このファイルはCakePHPのかなり重要な部分な感じがします。

ちょこっとずつ進めていきます。

まずは↓から。

require LIBS . 'configure.php';
$paths = Configure::getInstance();

cake/libs内のconfigure.phpを読み込んだ後、インスタンスを取得しています。getInstance()から、Singleton(シングルトン)であることが分かります。PHP4のシングルトンの解説は下記のサイトが分かりやすいです。

PHP4でデザインパターン(Singleton編)

また、&getInstance()メソッドの「&」や「&=」の意味は「てくめも@coop」さんのサイトに解説が載っています。

PHP4 と PHP5 の Sigleton Pattern

ソッド定義とメソッド呼び出しの両方に & を付けないと、参照でなくコピーになってしまい…

今日はあまり時間がないので、ここまでorz

次回はbootstrap.phpが「Configure」インスタンスで何をしているのか解析したいと思います。

/app/webroot/.htaccess(CakePHP解析 #3)

今回は「/app/webroot/.htaccess」を解析します。

ソースは下記のとおり。

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
    </IfModule>

RewriteCond

RewriteCondはURLをRewriteする条件になります。

「%{REQUEST_FILENAME}」は「要求したファイル名(フォルダ名)が」という意味。

URL指定で、「/app/webroot/aaa」ならば「aaa」がそれに当たります。

そして「!-d」は、この例であれば「aaa」というフォルダが存在するのであればRewriteしない。「!-f」はファイルが存在するのであればRewriteしないということになります。

この処理については、phaさんが自習室で詳しくまとめられています。

RewriteRuleをいろいろ試す会:RewriteCondを使う

QSAとは?

次にRewriteRule ^(.*)$ index.php?url=$1 [QSA,L]ですが、

URL書き換え部分は(.*)が$1に書き換わります。

「/app/webroot/aaa」でアクセスしたら、「/app/webroot/index.php?url=aaa」となります。

後にくっついている[QSA,L]の「QSA」の意味ですが、とみぞーノートさんのサイトに詳しくまとめられています。

mod_rewrite – QSAフラグ

次回は「cake/bootstrap.php」を解説したいと思います。

/.htaccess(CakePHP解析 #2)

前回は「app/webroot/index.php」から学習をスタートしましたが、じゃぁ「index.php」や「app/index.php」どうなっているのかと言いますと.htaccessによってシカトされてますね。おそらくmod_rewriteが使えない場合の対策なのでしょうが、その場合の処理まで解析していてはキリがありません。今日は最上層にある/.htaccessの解析をします。

/.htaccess(app/.htaccessもほぼ同じ内容)

<IfModule mod_rewrite.c>
   RewriteEngine on
   RewriteRule    ^$ app/webroot/    [L]
   RewriteRule    (.*) app/webroot/$1 [L]
</IfModule>

まずは、ですが、これはmod_rewriteモジュールが有効かどうか調べて、有効であれば中身の処理を実行するという意味です。

RewriteEngine on以下

次に中身の解説ですが、こちらの技林さんのサイトの解説が凄く分かりやすいです。この処理でapp/webroot/に飛ばしているわけですね。

mod_rewrite

正規表現は欠かせません

また、mod_rewriteを知る上で正規表現の知識は欠かせません。自分の正規表現入門お薦めサイトはこちらのサイトです。

サルにもわかる正規表現入門

更に正規表現を理解したい人はやはり「フクロウ本」を読むことをお奨めします。

詳説 正規表現 第3版

詳説 正規表現 第3版

  <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/を外して試してみましたが普通に動きました。うーん、でもやっぱ何かしらの理由があるんだろうな…。誰か分かる方いらっしゃいましたら教えてください(><) 次のエントリーでは「app/webroot/.htaccess」を解説したいと思います。
    </p>