腹が減ってはなんとやら

大学院博士課程から脱落しました。

/app/webroot/index.phpを読む-CakePHPをもくじとしてPHPを学ぶ03

前回に.htaccessを追って/app/webroot/index.phpにたどり着きました。 今回はindex.phpの中身を見ます。以下中身です。

<?php

if (!defined('DS')) {
    define('DS', DIRECTORY_SEPARATOR);
}

if (!defined('ROOT')) {
    define('ROOT', dirname(dirname(dirname(__FILE__))));
}

if (!defined('APP_DIR')) {
    define('APP_DIR', basename(dirname(dirname(__FILE__))));
}

if (!defined('WEBROOT_DIR')) {
    define('WEBROOT_DIR', basename(dirname(__FILE__)));
}

if (!defined('WWW_ROOT')) {
    define('WWW_ROOT', dirname(__FILE__) . DS);
}

if (php_sapi_name() == 'cli-server') {
    if ($_SERVER['REQUEST_URI'] !== '/' && file_exists(WWW_ROOT . $_SERVER['REQUEST_URI'])) {
        return false;
    }
    $_SERVER['PHP_SELF'] = '/' . basename(__FILE__);
}

まず色々定数を定義してますね。 サーバーのドキュメントルートが/var/www/htmlだったとして、そこにダウンロードした/cakephpディレクトリを置いてる場合、定義した定数はそれぞれ

  • DS = /
  • ROOT = /var/www/html/cakephp/
  • APP_DIR = app
  • WEBROOT_DIR = webroot
  • WWW_ROOT = /var/www/html/cakephp/app/webroot/
  • $_SERVER['PHP_SELF'] = /cakephp/app/webroot/index.php

になります。以下続きのコードです。

<?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;
    }
}
if (!empty($failed)) {
    trigger_error("CakePHP core could not be found. Check the value of CAKE_CORE_INCLUDE_PATH in APP/webroot/index.php. It should point to the directory containing your " . DS . "cake core directory and your " . DS . "vendors root directory.", E_USER_ERROR);
}

App::uses('Dispatcher', 'Routing');

$Dispatcher = new Dispatcher();
$Dispatcher->dispatch(
    new CakeRequest(),
    new CakeResponse()
);

次に、パスを通してます。 CAKE_CORE_INCLUDE_PATHは定義してないので、このif文には入ります。 次に、ini_set('include_path',...)でライブラリのパスを通します。 そんでもってbootstrap.phpをincludeします。 このbootstrap.phpでは他ディレクトリにあるクラスなどを自動でロードしてくれるので、規約通りにファイル名等を設定していれば、includeやrequireしなくてもclassが使えるようになります。

その後Dispatcherというクラスのインスタンスを生成してますね。 次回はbootstrap.phpの中身を見るかDispatcherを見に行くかどっちかかな。