CakePHPで本番と開発のファイルとファイル構成を同じにする

どの環境でもファイルを同じにしたい。
たとえば本番環境だからといってcore.phpファイルを別々にするとかをやめる。

デフォルトのCakePHPで開発環境と本番環境で共有できないのはcore.phpとdatabase.phpだろう。そのへんは
CakePHP core.phpの設定をbootstrap.phpに書く | Shin x blog
の方法が参考になります。
Railsと同じようにApacheの設定で環境変数を定義してやり、それにより各種設定を切り替えるという方法です。僕はこの方法をRailsっぽく応用しました。

Apacheの設定をかえる

本番環境でCAKE_ENVがproductionになるようにする($_SERVER['CAKE_ENV']で参照できる)

<VirtualHost *>
        DocumentRoot /var/www/www.example.com/htdocs
#....省略....
        ServerName www.example.com
        SetEnv CAKE_ENV production
</VirtualHost>

必要なディレクトリとファイルをつくる

--app
  |-config
    |-core.php
    |-database.php
    |-bootstrap.php
    |-environment #<=これを作る
    | |-default.php #<=これを作る
    | |-production.php #<=これを作る

bootstrap.phpで設定を行う

<?php
//環境の分岐
Configure::write('Config.environment',isset($_SERVER['CAKE_ENV']) ? $_SERVER['CAKE_ENV'] : "default");
//Config.environmentの値によって読み込むファイルを切り替える
require_once("environment/".basename(Configure::read('Config.environment').".php"));

default.phpとかの中身

別にしたいものなら何でも。core.phpの内容を上書きしてくれるので、core.phpから同じ設定を消す必要はありません。

<?php
 Configure::write('debug', 2);
 Configure::write('Cache.check', false);
 Configure::write('Security.salt', 'xxxx');

データベースの切替

database.phpに新しい設定を作る

<?php
class DATABASE_CONFIG {

	var $default = array(
		'driver' => 'mysql',
		'persistent' => false,
		'host' => 'localhost',
		'login' => 'test',
		'password' => 'oij8j99i',
		'database' => 'example_app',
		'encoding' => 'utf8',
	);

        var $production = array(
		'driver' => 'mysql',
		'persistent' => false,
		'host' => 'localhost',
		'login' => 'bababa',
		'password' => 'eeee333eeee',
		'database' => 'example_production',
		'encoding' => 'utf8',
	);
}
?>

app_model.phpを変更

<?php
class AppModel extends Model {
    function __construct($id = false, $table = null, $ds = null) {
        $this->useDbConfig = Configure::read('Config.environment');
        parent::__construct($id, $table, $ds);
    }
}
?>

まとめ

これで本番環境でもテスト環境でも同じファイルが共有できるようになった。
次回は実際にCapistranoを設定する