DB環境の切り替えについてググってみると(1)database.php内でIPアドレスを参照して切り替える方法や、(2)Config/core.phpまたはconfig/bootstrap.phpに設定を書き込む方法がヒットします(こことか)。
しかしどちらもあまりしっくりこなかったので第3の案を考えてみます。理由は(1)の場合:IPアドレスやホスト名に依存するとネットワークが変わった時に動作しない。ネットワーク設定とデータベース設定が連動しているのは直感的ではない(まあわかるんだけど)(2)の場合:core.phpやbootstrap.phpは他の設定も入るので、基本的にはアプリケーションと一体と考えて、バージョン管理したい。core.phpやbootstrap.phpはアプリケーションの設定であって、database.phpのデフォルト接続のようなインフラよりの設定は分離したい(これもまあいいような気もするけど)。
そこで、「app/Configディレクトリ内に環境を指定する空のファイルを設置し、それが置いてある環境ではその設定をDBのデフォルト設定とする」、という実装をつくってみました。ファイル名は仮にUSE_DATABASE_CONFIG_{CONFIG_NAME}としています。
このファイルがapp/Configディレクトリ内(database.phpと同じ階層)に存在すれば、見つかったCONFIG_NAMEを使ってDATABASE_CONFIG.CONFIG_NAMEの設定をデフォルトとする(なければdevを使う)。
こうすれば、このダミーファイルだけを開発(商用)環境に置くことでその他の設定ファイルを全てバージョン管理化におくことができるので、このほうが取り回しがしやすいのではないかな、と。
ということで、gistを置いてみました。なにかの参考になれば幸いです。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
// CakePHP 2.x database.php file to switch between database configuration settings based on file existence under app/Config directory | |
/** | |
* This is core configuration file. | |
* | |
* Use it to configure core behaviour of Cake. | |
* | |
* PHP 5 | |
* | |
* CakePHP(tm) : Rapid Development Framework (http://cakephp.org) | |
* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) | |
* | |
* Licensed under The MIT License | |
* For full copyright and license information, please see the LICENSE.txt | |
* Redistributions of files must retain the above copyright notice. | |
* | |
* @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) | |
* @link http://cakephp.org CakePHP(tm) Project | |
* @package app.Config | |
* @since CakePHP(tm) v 0.2.9 | |
* @license http://www.opensource.org/licenses/mit-license.php MIT License | |
* | |
* Database configuration class. | |
* You can specify multiple configurations for production, development and testing. | |
* | |
* datasource => The name of a supported datasource; valid options are as follows: | |
* Database/Mysql - MySQL 4 & 5, | |
* Database/Sqlite - SQLite (PHP5 only), | |
* Database/Postgres - PostgreSQL 7 and higher, | |
* Database/Sqlserver - Microsoft SQL Server 2005 and higher | |
* | |
* You can add custom database datasources (or override existing datasources) by adding the | |
* appropriate file to app/Model/Datasource/Database. Datasources should be named 'MyDatasource.php', | |
* | |
* | |
* persistent => true / false | |
* Determines whether or not the database should use a persistent connection | |
* | |
* host => | |
* the host you connect to the database. To add a socket or port number, use 'port' => # | |
* | |
* prefix => | |
* Uses the given prefix for all the tables in this database. This setting can be overridden | |
* on a per-table basis with the Model::$tablePrefix property. | |
* | |
* schema => | |
* For Postgres/Sqlserver specifies which schema you would like to use the tables in. Postgres defaults to 'public'. For Sqlserver, it defaults to empty and use | |
* the connected user's default schema (typically 'dbo'). | |
* | |
* encoding => | |
* For MySQL, Postgres specifies the character encoding to use when connecting to the | |
* database. Uses database default not specified. | |
* | |
* unix_socket => | |
* For MySQL to connect via socket specify the `unix_socket` parameter instead of `host` and `port` | |
*/ | |
class DATABASE_CONFIG { | |
public $default = null; | |
public $dev = array( | |
//put database config here | |
); | |
public $test = array( | |
//put database config here | |
); | |
public $prod = array( | |
//put database config here | |
); | |
public function __construct(){ | |
App::uses('Folder', 'Utility'); | |
//if file named USE_DATABASE_CONFIG_name exists, use DATABASE_CONFIG.name as default config | |
//if multiple USE_DATABASE_CONFIG_* files found, use the first one. | |
$dir_path = ROOT . DS . APP_DIR . DS . 'Config' . DS; | |
$dir = new Folder($dir_path); | |
$f = $dir->find('USE_DATABASE_CONFIG_.*', true); | |
if (count($f)<=0) { | |
//using default(dev) setting if USE_DATABASE_CONFIG_* is not found. | |
$this->default = $this->dev; | |
return; | |
} else { | |
//using default(dev) setting if USE_DATABASE_CONFIG_* is not found. | |
//fetch config name | |
ereg('USE_DATABASE_CONFIG_(.*)', $f[0], $ret); | |
$config_name = $ret[1]; | |
if (isset($this->{$config_name})) { | |
$this->default = $this->{$config_name}; | |
} else { | |
//use default(dev) configuration if accoumpanied configuration is not found | |
$this->default = $this->dev; | |
} | |
return; | |
} | |
} | |
} |
0 件のコメント:
コメントを投稿