【CakePHP3】環境によってデータベースの接続先を切り替える方法

プログラミング
スポンサーリンク

開発環境、テスト環境、本番環境、皆さんはどうやって接続先を切り替えていますか?
僕は正直、config > app.phpにあるDatasourcesのdefaultを毎環境書き換えるしか思い浮かびませんでした。

てか、公式には、これといった方法が紹介されてませんよね。
まいどapp.phpを書き換えてアップロードするのも面倒くさいです。

今回は、app.phpにすべての環境のデータベース接続設定を書いてしまって、
環境によって切り替わるようにする方法を知ることができましたので、ご紹介します。

ぶっちゃけ、公式で”コレ!”という情報がないため、正しいかどうかはわかりません。
でも実現はできたので安心してください。

環境構築

環境

virtualboxとvagrantをつかった仮想環境でCentOS7を動かしています。
webサーバはApacheです。
データベースサーバはMariaDB(マリアDB)です。

データベース

今回はデータベースを2つ作りました。

  • my_database_develop
  • my_database_production

です。要するに開発用と本番用ですね。

MariaDBに上記2つのデータベースを作成します。

-- 開発環境データベース
CREATE DATABASE my_database_develop DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
-- 本番用データベース
CREATE DATABASE my_database_production DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

プログラム側からアクセスするためのユーザを作成します。

-- 開発環境ユーザー
GRANT ALL PRIVILEGES ON my_database_develop.* to develop_user@localhost IDENTIFIED BY 'samplepassword';
-- 本番環境ユーザー
GRANT ALL PRIVILEGES ON my_database_production.* to production_user@localhost IDENTIFIED BY 'samplepassword';

同じテーブルを先ほど作成した2環境に作ります。

-- 友人テーブル
CREATE TABLE `my_friends` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(256) DEFAULT NULL,
  `birthday` date DEFAULT NULL,
  `salary` int(11) DEFAULT NULL,
  `address` varchar(256) DEFAULT NULL,
  `email` varchar(256) DEFAULT NULL,
  `created` datetime DEFAULT NULL,
  `modified` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
);

ちなみにコレ、友人のサラリーを登録できるテーブルです。

これに本番環境と開発環境とで違うデータを入れて、
ちゃんと切り替わってるということを確認します。

-- 本番用インサート文
INSERT INTO my_friends
(id, name, birthday, salary, address, email, created, modified)
VALUES(2, '本番ほげ太', '1988-10-31', 27, '島根県', 'honban@uymk.kj', '2019-04-02 00:00:00.000', '2019-04-02 00:00:00.000');

-- 開発用インサート文
INSERT INTO my_friends
(id, name, birthday, salary, address, email, created, modified)
VALUES(2, '開発ぴよ子', '1985-12-23', 36, '滋賀県', 'kaihatsu@uymk.kj', '2019-04-02 00:00:00.000', '2019-04-02 00:00:00.000');

プログラム側

ソースコード自体は上記テーブルを作成した後にbake allしたソースをそのまま使います。

接続先の設定だけ、default(開発環境用)以外にproductionを追加します。

'Datasources' => [
    // 開発環境用
    'default' => [
        'className' => 'Cake\Database\Connection',
        'driver' => 'Cake\Database\Driver\Mysql',
        'persistent' => false,
        'host' => 'localhost',
        'username' => 'develop_user',
        'password' => 'samplepassword',
        'database' => 'my_database_develop',
        'timezone' => 'UTC',
        'flags' => [],
        'cacheMetadata' => true,
        'log' => false,
        'quoteIdentifiers' => false,
        'url' => env('DATABASE_URL', null),
    ],
   // 本番環境用
    'production' => [
        'className' => 'Cake\Database\Connection',
        'driver' => 'Cake\Database\Driver\Mysql',
        'persistent' => false,
        'host' => 'localhost',
        'username' => 'production_user',
        'password' => 'samplepassword',
        'database' => 'my_database_production',
        'timezone' => 'UTC',
        'flags' => [],
        'cacheMetadata' => true,
        'log' => false,
        'quoteIdentifiers' => false,
        'url' => env('DATABASE_URL', null),
    ],
],

見やすさ重視で、初期に書いてあったコメントはすべて消しました。

以上で下準備は完了です。
vagrantを立ち上げて、アクセスしてみると下のようになってると思います。

開発環境(default)の状態です。

何環境かを書き記す

まずは、今このプログラムが動いているのは何環境なのかを
サーバ側に書き記しておく必要があります。
書き記すファイルはサーバにある、「httpd.conf」です。

下記文字列をhttpd.confの最下行に書いて、上書き保存してください。

SetEnv CAKEPHP_ENV production

デフォルトが開発環境につながるため、わかりやすく、
「本番環境(production)ですよ。」という設定をしています。

上書き保存が終わったら、設定を反映させるために
Apacheの再起動を忘れずしておいてください。

sudo su
systemctl restart httpd.service

環境の判定はenv()を使う

先ほど、httpd.confに書いた設定はCakePHP3にもともと用意されている
env()で取得することができます。

ためしに、index.ctpでechoで出力してみましょう。

src/Template/MyFriends/index.ctp

<?php echo env('CAKEPHP_ENV');?>

でました。

接続先はdefaultConnectionName()で切り替える

接続先を切り替えるためにTableクラスにはdefaultConnectionName()が用意されています。

でもさすがにTableクラスを上書きするのは気が引けるので、Tableクラスを継承している各種テーブルクラスでオーバーライドします。

src/Model/Table/MyFriendsTable.php

public static function defaultConnectionName()
{
    return empty(env('CAKEPHP_ENV'))?'default':env('CAKEPHP_ENV');
}

 

画像では、もし設定をとってきても空だったら、defaultの設定につながるようにしています。

動かしてみる

もう一度ページをリロードします。

本番用にインサートしたデータに切り替わっています。

以上です。

参考サイト

CakePHP3で環境を切り替え(development/production)
今日もしつこく CakePHP 3 の話題です、ちょっと飽きてきましたけど。以前、CakePHP で production, development, staging などで、環境を切り替えてデータベース・設定のファイルを読み込む方法を書い...
タイトルとURLをコピーしました