CakePHP の bootstrap.phpcore.php 全訳 しました!!

PHP Advent Calendar 2012 の3日目です。

CakePHP の bootstrap.php と core.php の中って、ドキュメントばりに一杯コメント書いてあるんですが、全部英語なので、素敵な仕様も埋もれちゃってるかなあなんて思い、ここは全訳して、一つ一つ見ていこうかと思います!
(bootstrap.php の日本語バージョンはこちら。)
(core.php の日本語バージョンはこちら。)


■■ 1. bootstrap.php


■1-1) 冒頭
/**
* このファイルは app/webroot/index.php から自動的に読み込まれ、core.php の後に
* 読み込まれます。
*
* このファイルはアプリケーション全体の設定を作成する/読み込むのに使ってください。
* 例: キャッシュ、ログ、別の設定ファイルの読み込みなど。
*
* また、あなたのアプリケーションで使う、グローバルな関数/定数の定義ファイルを
* include するのにもこのファイルを使ってください。
*
* PHP 5
*
* CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
* Copyright 2005-2012, Cake Software Foundation, Inc. (http://cakefoundation.org)
*
* Licensed under The MIT License
* ファイルの再配布には上記の著作権表示が必須です。
*
* @copyright Copyright 2005-2012, Cake Software Foundation, Inc. (http://cakefoundation.org)
* @link http://cakephp.org CakePHP(tm) Project
* @package app.Config
* @since CakePHP(tm) v 0.10.8.2117
* @license MIT License (http://www.opensource.org/licenses/mit-license.php)
*/
ここは特にそのままなので、次いきまーす。


■1-2) キャッシュエンジンの設定
/**
* キャッシュエンジンの設定。
* デフォルトの設定は以下のとおり。
*
* ファイル・ストレージ・エンジン。
*
* Cache::config('default', array(
* 'engine' => 'File', //[必須]
* 'duration' => 3600, //[省略可]
* 'probability' => 100, //[省略可]
* 'path' => CACHE, //[省略可] システムの tmp ディレクトリを使う。注:絶対パスであること。
* 'prefix' => 'cake_', //[省略可] prefix every cache file with this string
* 'lock' => false, //[省略可] ファイル・ロックを使う。
* 'serialize' => true, //[省略可]
* 'mask' => 0666, //[省略可] キャッシュ・ファイルを生成した際に使うパーミッション・マスク
* ));
*
* APC (http://pecl.php.net/package/APC)
*
* Cache::config('default', array(
* 'engine' => 'Apc', //[必須]
* 'duration' => 3600, //[省略可]
* 'probability' => 100, //[省略可]
* 'prefix' => Inflector::slug(APP_DIR) . '_', //[省略可] この文字列を各キャッシュファイルの接頭辞として使う。
* ));
*
* Xcache (http://xcache.lighttpd.net/)
*
* Cache::config('default', array(
* 'engine' => 'Xcache', //[必須]
* 'duration' => 3600, //[省略可]
* 'probability' => 100, //[省略可]
* 'prefix' => Inflector::slug(APP_DIR) . '_', //[省略可] この文字列を各キャッシュファイルの接頭辞として使う。
* 'user' => 'user', //xcache.admin.user の設定値から user を取得する。
* 'password' => 'password', //平文のパスワード (xcache.admin.pass)
* ));
*
* Memcache (http://memcached.org/)
*
* Cache::config('default', array(
* 'engine' => 'Memcache', //[必須]
* 'duration' => 3600, //[省略可]
* 'probability' => 100, //[省略可]
* 'prefix' => Inflector::slug(APP_DIR) . '_', //[省略可] この文字列を各キャッシュファイルの接頭辞として使う。
* 'servers' => array( //[省略可]
* '127.0.0.1:11211' // localhost, デフォルトのポートは 11211
* ),
* 'persistent' => true, // [省略可] 非持続接続(non-persistent connections)にしたいなら false に設定する。
* 'compress' => false, // [省略可] Memcache のデータを圧縮する(遅くなるがメモリを節約できる)
* ));
*
* Wincache (http://php.net/wincache)
*
* Cache::config('default', array(
* 'engine' => 'Wincache', //[必須]
* 'duration' => 3600, //[省略可]
* 'probability' => 100, //[省略可]
* 'prefix' => Inflector::slug(APP_DIR) . '_', //[省略可] この文字列を各キャッシュファイルの接頭辞として使う。
* ));
*
* Redis (http://http://redis.io/)
*
* Cache::config('default', array(
* 'engine' => 'Redis', //[必須]
* 'duration' => 3600, //[省略可]
* 'probability' => 100, //[省略可]
* 'prefix' => Inflector::slug(APP_DIR) . '_', //[省略可] prefix every cache file with this string
* 'server' => '127.0.0.1', // localhost
* 'port' => 6379, // デフォルトのポートは 6379
* 'timeout' => 0, // タイムアウトの秒数。0 は無制限。
* 'persistent' => true, // [省略可] 非持続接続(non-persistent connections)にしたいなら false に設定する。
* ));
*/
Cache::config('default', array('engine' => 'File'));

ここでは、使いたいキャッシュエンジンを選んで、指定します。


■1-3) App::buildの設定
/**
 * 下記の設定で、モデル、ビュー、コントローラのパスを追加することができます。
 *
 * App::build(array(
 *     'Model'                     => array('/path/to/models', '/next/path/to/models'),
 *     'Model/Behavior'            => array('/path/to/behaviors', '/next/path/to/behaviors'),
 *     'Model/Datasource'          => array('/path/to/datasources', '/next/path/to/datasources'),
 *     'Model/Datasource/Database' => array('/path/to/databases', '/next/path/to/database'),
 *     'Model/Datasource/Session'  => array('/path/to/sessions', '/next/path/to/sessions'),
 *     'Controller'                => array('/path/to/controllers', '/next/path/to/controllers'),
 *     'Controller/Component'      => array('/path/to/components', '/next/path/to/components'),
 *     'Controller/Component/Auth' => array('/path/to/auths', '/next/path/to/auths'),
 *     'Controller/Component/Acl'  => array('/path/to/acls', '/next/path/to/acls'),
 *     'View'                      => array('/path/to/views', '/next/path/to/views'),
 *     'View/Helper'               => array('/path/to/helpers', '/next/path/to/helpers'),
 *     'Console'                   => array('/path/to/consoles', '/next/path/to/consoles'),
 *     'Console/Command'           => array('/path/to/commands', '/next/path/to/commands'),
 *     'Console/Command/Task'      => array('/path/to/tasks', '/next/path/to/tasks'),
 *     'Lib'                       => array('/path/to/libs', '/next/path/to/libs'),
 *     'Locale'                    => array('/path/to/locales', '/next/path/to/locales'),
 *     'Vendor'                    => array('/path/to/vendors', '/next/path/to/vendors'),
 *     'Plugin'                    => array('/path/to/plugins', '/next/path/to/plugins'),
 * ));
 *
 */
CakePHP 関連のディレクトリの Path を通す感じです。
たとえば、下記のようにすると、デフォルトの /app/Model に加え、/app/WebAPI からもモデルを探しにいくようになります。
App::build(array(
    'Model' => array(ROOT.DS.'app'.DS.'WebAPI'),
), App::PREPEND);
なお App::PREPEND の代わりに、App::APPEND を指定すると、デフォルトよりも優先して(先に)探しにいきます。
ROOT や DS の定数は index.php で定義されているものです。


■1-4) Inflector ルール
/**
 * 独自の Inflector ルール。
 * テーブル名や、モデル名、コントローラ名、単複形変換関数に渡されるすべての文字列を正しく単数形や複数形に変換するための設定。
 *
 * Inflector::rules('singular', array('rules' => array(), 'irregular' => array(), 'uninflected' => array()));
 * Inflector::rules('plural', array('rules' => array(), 'irregular' => array(), 'uninflected' => array()));
 *
 * ※ singular : 単数形  /  plural : 複数形
 * ※ rules : 語尾変化ルール  /  irregular : 不規則変化 / uninflected : 語尾変化しない
 *
 */
テーブル名やコントローラ名は複数形でモデル名は単数形ですが、これらを相互に変換するためのロジックを定義します。(デフォルトならもちろん不要です。)

rules では、正規表現を使って一般的な語形変化ロジックを指定します。
例) rules => array('/$/' => 's')

irregular は、変換のテーブルを連想配列で渡します。
uninflected は変換しない単語を配列で渡します。

ちなみに、日本人にとっては複数形をなぜわざわざ使うのか判りづらいかもしれませんね。
たとえばなぜ Controller を複数形にしたいかというと、/items/ というURLで item のリストを出したいし、
/items/12 という URL で items の中の id=12 の item の詳細を出したい、
という感覚によるものですが、なんとなく判りますでしょうか?

ちなみに下記のようにすると、単数形・複数形の変換を完全にOFFにすることができます。
全部単数形でOKになります。
//全ての単語をそのまま使う(語形変化しない)。
Inflector::rules('plural', array('rules' => array('/^(.*)$/' => '\1')));


■1-5) プラグイン読み込み
/**
 * プラグインは手動で読み込む必要があります。1つ1つロードすることも、1回の呼び出しで全部を読み込むこともできます。
 * 必要に応じて、以下のどちらかのコメントアウトを解除してください。
 * より高度なプラグインの読み込み方法については、CakePlugin のドキュメントを確認してください。
 *
 * CakePlugin::loadAll(); // 一度にすべてのプラグインを読み込む。
 * CakePlugin::load('DebugKit'); //DebugKit という名前のプラグイン1個を読み込む。
 *
 */
ここでプラグインを読み込みます。
loadAll ではプラグインのディレクトリにあるすべてのプラグインが読み込まれます。


■1-6) Dispatcher 設定
/**
 * イベント・リスナーをリクエストのライフサイクルに組み込むことが可能です。CakePHPはデフォルトで2つのフィルターを組み込むます。
 *
 * - AssetDispatcher フィルターは、あなたのテーマとプラグインから資産ファイル(css, images, js 等)を供給します。
 * - CacheDispatcher フィルターは、Cache.check の configure の値を読み、コントローラにより作成済みのキャッシュされたコンテンツを供給しようと試みます。
 *
 * あなたのアプリケーションに合わせて、好きなように追加/削除してください。
 * 使用例:
 *
 * Configure::write('Dispatcher.filters', array(
 *        'MyCacheFilter', //  あなたの app 内の、Routing/Filter パッケージから MyCacheFilter クラスを使います。
 *        'MyPlugin.MyFilter', // MyPlugin プラグイン内の、 Routing/Filter パッケージから MyFilter クラスを使います。
 *        array('callable' => $aFunction, 'on' => 'before', 'priority' => 9), // beforeDispatch で呼び出される、PHP コールバック形式での有効な記述
 *        array('callable' => $anotherMethod, 'on' => 'after'), // afterDispatch で呼び出される、PHP コールバック形式での有効な記述
 * ));
 */
Configure::write('Dispatcher.filters', array(
    'AssetDispatcher',
    'CacheDispatcher'
));
リクエストの前後に処理を加えることができます。


■1-7) ログ出力の設定
/**
 * デフォルトで使われる、ファイルにログを出力する際のオプション。
 */
App::uses('CakeLog', 'Log');
CakeLog::config('debug', array(
    'engine' => 'FileLog',
    'types' => array('notice', 'info', 'debug'),
    'file' => 'debug',
));
CakeLog::config('error', array(
    'engine' => 'FileLog',
    'types' => array('warning', 'error', 'critical', 'alert', 'emergency'),
    'file' => 'error',
));
ログ出力の設定です。


core.php 編へつづく。