index.phpを適切に書き直す

この記事はだいぶ前に書かれたものなので情報が古いかもしれません

はい、そーゆーわけで、前回の終わりに宣言した通り、index.phpの話をしたいと思います。

正直、分かってみれば全然たいしたことなかったんですけど、分かるまでは無駄に苦戦しまして……未だにエンジニアとしてはその程度のレベルでしかないってのが窺えた瞬間でしたね。


Cake1.2の頃(現在のお宿)の設定は

ドキュメントルートの直下に落として来た本体をそのまま突っ込む場合は問題ないんですけど、それだとセキュリティが弱いというか……URL叩いたらディレクトリが全部追えちゃうってのはあまりよろしくないわけで、だから通常デフォルトでappディレクトリの下にあるwebrootと、appやcakeのコア部分を切り離してサーバーに置くってやり方を、このお宿でもやってます。

ざっくり書くと、こんな感じですね。

・cake
  ・app
    ・コントローラーやモデル、ビュー
  ・cake
    ・コアライブラリ
・www
  ・index.php
  ・css
  ・js
  ・その他.htaccessとか

ディレクトリ名は適当ですけど、あかつきのお宿の現状のディレクトリ構成はこんな感じです。

で、そのときにwebrootの中にあったindex.phpをちょっとだけ書き換える必要があるんですよ。主に定数の部分が。

デフォルトだとindex.phpの中身はこんな感じになってます。本当はもうちょっといろいろ書いてあるけど、今回は書き換えの必要がある部分だけね。

/**
 * The full path to the directory which holds "app", WITHOUT a trailing DS.
 *
 */
  if (!defined('ROOT')) {
    define('ROOT', dirname(dirname(dirname(__FILE__))));
  }
/**
 * The actual directory name for the "app".
 *
 */
  if (!defined('APP_DIR')) {
    define('APP_DIR', basename(dirname(dirname(__FILE__))));
  }
/**
 * The absolute path to the "cake" directory, WITHOUT a trailing DS.
 *
 */
  if (!defined('CAKE_CORE_INCLUDE_PATH')) {
    define('CAKE_CORE_INCLUDE_PATH', ROOT);
  }

要は、appやcakeのディレクトリが置いてあるパスを定数で設定しているわけですね。ここを任意に書き換えて参照できるようにしてあげないといけない。

例えば、/home/test/cake/というディレクトリの下にappやらcakeを置いてるとしたら、こんな感じに書き換える。

/**
 * The full path to the directory which holds "app", WITHOUT a trailing DS.
 *
 */
  if (!defined('ROOT')) {
    define('ROOT', DS.'home'.DS.'test'.DS.'cake');
  }
/**
 * The actual directory name for the "app".
 *
 */
  if (!defined('APP_DIR')) {
    define('APP_DIR', 'app');
  }
/**
 * The absolute path to the "cake" directory, WITHOUT a trailing DS.
 *
 */
  if (!defined('CAKE_CORE_INCLUDE_PATH')) {
    define('CAKE_CORE_INCLUDE_PATH', ROOT);
  }

こうすることで、定数のROOTは『/home/test/cake』を表すようになり、appディレクトリのパスを表す定数APP_DIRの方は『app』を表すようになります。まあ、APP_DIRの方はもしかしたら書き換えなくても動くかもしれないね。僕の場合は上手くいかなかったから書き換えたけど。



バージョン2.0の場合

上と同じようにwebrootとappやcakeを分けるとすると、ディレクトリ構成はこんな感じになります。

・cake
  ・app
    ・コントローラーやモデル、ビュー
  ・lib
    ・Cake
      ・コアライブラリ
・www
 ・index.phpほか

そうそう。前回の記事でも書いたんですけど、Cake2.0の本体を落として来た場合、デフォルトのディレクトリ構成ではCakeのコアライブラリがどういうわけかlibというディレクトリの下に入っているんですね。

まあそれ自体はそんなに大きな問題ではないんですが……とりあえず2.0の方のindex.phpを見ると、デフォルトがこんな感じになってます。

/**
 * The full path to the directory which holds "app", WITHOUT a trailing DS.
 *
 */
  if (!defined('ROOT')) {
    define('ROOT', dirname(dirname(dirname(__FILE__)))); 
  }
/**
 * The actual directory name for the "app".
 *
 */
  if (!defined('APP_DIR')) {
    define('APP_DIR', basename(dirname(dirname(__FILE__)))); 
  }

/**
 * The absolute path to the "cake" directory, WITHOUT a trailing DS.
 *
 * Un-comment this line to specify a fixed path to CakePHP.
 * This should point at the directory containing `Cake`.
 *
 * For ease of development CakePHP uses PHP's include_path.  If you
 * cannot modify your include_path set this value.
 *
 * Leaving this constant undefined will result in it being defined in Cake/bootstrap.php
 */
  //define('CAKE_CORE_INCLUDE_PATH', ROOT . DS . 'lib');

まあ、基本的には前と変わりません。

ただ一点違うのが、『CAKE_CORE_INCLUDE_PATH』の定数がなぜかコメントアウトされてます。

こういう改修ってどういう利点につながってるのかってのは僕程度の人間では全く理解できないのですが、今回はこの定数が定義されているかどうかの分岐があるみたいなんですね。

index.phpの中身をもうちょい下にスクロールさせると、こんなソースが出て来ます。

if (!defined('CAKE_CORE_INCLUDE_PATH')) {
  if (function_exists('ini_set')) {
    ini_set('include_path', ROOT . DS . 'lib' . PATH_SEPARATOR . ini_get('include_path'));
  }
  if (!include('Cake' . DS . 'bootstrap.php')) {
    $failed = true;
  }
} else {
  if (!include(CAKE_CORE_INCLUDE_PATH . DS . 'Cake' . DS . 'bootstrap.php')) {
    $failed = true;
  }
}

CAKE_CORE_INCLUDE_PATHが定義されていたら、その定数で示されるパスの直下にあるCakeというディレクトリの中のbootstrap.phpを読み込むと、でも定義されてなかったら……まあ何かとりあえずどっかにあるCakeディレクトリのbootstrap.phpを読み込むと、そんな感じですね。

細かい説明は抜きにして、以前のバージョンからの移行だったら、たぶんこの定数は定義しておく方が楽なような気がしたので、僕はコメントアウトを外して適当に書き直しました。

/**
 * The full path to the directory which holds "app", WITHOUT a trailing DS.
 *
 */
  if (!defined('ROOT')) {
    define('ROOT', DS.'home'.DS.'test'.DS.'cake');
  }
/**
 * The actual directory name for the "app".
 *
 */
  if (!defined('APP_DIR')) {
    define('APP_DIR', 'app'); 
  }

/**
 * The absolute path to the "cake" directory, WITHOUT a trailing DS.
 *
 * Un-comment this line to specify a fixed path to CakePHP.
 * This should point at the directory containing `Cake`.
 *
 * For ease of development CakePHP uses PHP's include_path.  If you
 * cannot modify your include_path set this value.
 *
 * Leaving this constant undefined will result in it being defined in Cake/bootstrap.php
 */
  define('CAKE_CORE_INCLUDE_PATH', ROOT);

1.2のときと同じにしたって感じですね。

で、説明が前後しちゃって申し訳ないんですけど、僕はデフォルトの構成でCakeディレクトリの上に何でlibなんてディレクトリを設けているのかがよく分からなかったもんで、libのディレクトリは削りました。

だからこうなってます。

・cake
  ・app
    ・コントローラーやモデル、ビュ
  ・Cake
    ・コアライブラリ
・www
 ・index.phpほか

もしlibをそのまま残した状態にするなら、『CAKE_CORE_INCLUDE_PATH』は以下のように書く必要があります。

define('CAKE_CORE_INCLUDE_PATH', ROOT.DS.'lib');

たぶんlibは削っても問題がないように思うんですけど、この新しいディレクトリ構成が実はとんでもないメリットを生み出す構成だったりしたらどうしよ……。




今回はここまでですね。思ったより長くなっちゃったね。めんご。

次回は何の話をしようかな……コントローラー周りの話をちょっとしたいと思います。


では、次回もこのチャンネルでお会いしましょう。

アディオス、アミーゴ。

Cakephp2.0について書いた記事のまとめ | 日記の間 | あかつきのお宿 2012年05月11日 10:59:54
[...] ・Cakephp2.0を触ってみたよ ・index.phpを適切に書き直す ・AppController.phpに関するあれやこれやそれやどれ? [...]
photo男 2014年07月30日 22:01:04
最近phpを学び初めて、Webサービスを作っているものです。
この記事のおかげで、つまづいていた問題が解決しました。
ありがとうございます。
まっち~(管理人) 2014年07月31日 20:01:38
>photo男さん
こちらこそ、読んでいただいてありがとうございます。
お役に立てたのなら幸いです。
ssmxgo 2015年01月20日 13:00:25
Cake1系からCake2系になってコアライブラリ?のディレクトリの位置が
ROOT/cake
 ↓
ROOT/lib/Cake

になったから、合わせて

define('CAKE_CORE_INCLUDE_PATH', ROOT);
 ↓
define('CAKE_CORE_INCLUDE_PATH', ROOT.DS.'lib');

になったとさ。でもこの設定がうまくできてなくても動きますね、なんでだろ?
まっち~(管理人) 2015年01月22日 10:29:51
>ssmxgoさん
「ROOT/Cake」の状態で「define('CAKE_CORE_INCLUDE_PATH', ROOT);」をコメントアウトしていても動くっていうことですかね?

僕の場合は「ROOT/Cake」だとコメントアウト外しとかないと動かないのですが、もしかしたらバージョンが上がってその辺を設定しなくても良い感じになったのかもしれないですね。

ちなみにこの記事を書いてた頃のバージョンは2.0でした。今は2.3を使ってますけど、コメントアウトするとやっぱり動かないっぽいです。
もしかしたら何か関連しているかも?