ローカル、ステージング、本番など複数の環境があって、それぞれデータベースが異なる想定。環境に応じてデータベースの設定を変える方法を考える。
方法1: 設定ファイルを差し替える
環境ごとに設定ファイルを作っておいて、動作環境に応じて差し替える。例えば以下のファイルを作っておいて、ディプロイするときに動作環境に応じたファイルをDatabase.phpにリネームするわけだ。
- Config/Database.local.php – ローカル用
- Config/Database.staging.php – ステージング用
- Config/Database.production.php – 本番用
この方法はわかりやすいが、ディプロイ作業が僅かに煩雑になる。例えば、リモートリポジトリにコードがまとめられている場合、単純にクローンするだけでは足りず、手動でDatabase.phpを仕度する必要がある。ディプロイ手順を工夫すれば済む話だけど。
方法2: プログラムで環境を判別して設定を動的に変える
現在の動作環境をプログラムで判別できるならば、データベース設定を動的に切り替える仕組みをDatabase.phpに組み込んでやればいい。例えば環境ごとにドメインが異なるなら以下のようにできる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
class DATABASE_CONFIG { public $default = array(); // 本番用 public $production = array( 'datasource' => 'Database/Mysql', 'persistent' => false, 'host' => 'mysql.production.host', 'login' => 'dbuser1', 'password' => 'dbpass1', 'database' => 'dbname1', 'prefix' => '', 'encoding' => 'utf8', ); // ステージング用 public $staging = array( 'datasource' => 'Database/Mysql', 'persistent' => false, 'host' => 'mysql.staging.host', 'login' => 'dbuser2', 'password' => 'dbpass2', 'database' => 'dbname2', 'prefix' => '', 'encoding' => 'utf8', ); // ローカル用 public $development = array( 'datasource' => 'Database/Mysql', 'persistent' => false, 'host' => 'localhost', 'login' => 'dbuser3', 'password' => 'dbpass3', 'database' => 'dbname3', 'prefix' => '', 'encoding' => 'utf8', ); public function __construct() { switch (env('HTTP_HOST')) { case 'localhost': $this->default = $this->development; break; case 'www.staging.host': $this->default = $this->staging; break; case 'www.production.host': $this->default = $this->production; break; } } } |
この方法の利点はディプロイが楽なこと。環境ごとに設定ファイルを用意する必要が無く、単純にディプロイするだけで動く。結果的に手間が減るしミスも減る。欠点らしい欠点はみつからないので、僕的には最近はこの方法を使うことが多い。