綺麗に死ぬITエンジニア

CakePHP 3でDotenvを使って環境設定する方法

2017-01-23

LaravelなんかのPHPフレームワークでは、デフォルトで.envファイルを用いて環境設定(Dotenv)するようになっています。

CakePHP 3は、デフォルトでDotenvが利用できる形にはなっていないので、ライブラリを導入してDotenvで環境設定ができるよう実装する手順を解説していきます。

※ CakePHP 3.5以降では、Dotenvライブラリーのサポートが、アプリケーションスケルトンに追加されました。従って、バージョン3.5.0以降では本記事の手順を踏むことなく利用できます。

Dotenvとは?

Dotenvとは、もともとRuby界隈で考えられた仕組みで、.envというファイルに環境情報(データベース接続情報やメールサーバー接続情報など)をまとめて記述して、それをロードすることで環境設定を行う仕組みです。

通常、.envはGit等のバージョン管理の対象外とし、デプロイする際に記述(配置)します。

これまで多くのPHPフレームワークではdevelopment環境とproduction環境の両方の環境設定を用意しておき状況によって切り替える、というのが普通でしたが、これは開発環境用の設定ファイルとか本番環境用の設定ファイルとかそういったことは抜きに、サーバーごとに環境設定ファイルを個別に持とう!というものです。

設定ファイルの構成や設定手順がわかりやすくなるため、CakePHPに限らず、他のフレームワークやピュアPHPで開発する際など、多くの場合においてオススメしたい仕組みです。

PHP Dotenvのインストール

では、実際に設定していきます。

まず、PHP Dotenvをインストールします。composerを利用し、以下のコマンドを実行します。

composer require josegonzalez/dotenv:dev-master

なお、最新版のライブラリ(v3.0.0以降)では、対応PHPのバージョンがPHP 7.0+となっています。PHP 5系で利用したい場合は、以下のコマンドを入力します。

composer require josegonzalez/dotenv:~2.0

CakePHP 3への設定

ライブラリーがインストールできたら、CakePHPへ環境設定を読み込む記述を追加します。

CakePHPのconfig/bootstrap.phpファイルのpaths.phpが読み込まれた後の部分(42行目付近)へ、以下の記述を追加します。

/*
 * PHP Dotenv
 */
try {
    josegonzalez\Dotenv\Loader::load([
        'filepath' => __DIR__ . DS . '.env',
        'toEnv' => true
    ]);
} catch (InvalidArgumentException $e) {
    // do nothing in case the file doesn't exist
}

これで、config/.envファイルを読み込むようになります。プロジェクトルートの.envを読ませたい場合は、__DIR__の部分をROOTにすればいいでしょう。

.envファイルの追加

CakePHP 3をインストールしてすぐの初期状態では、設定ファイルであるconfig/app.phpファイルの複数箇所で、env関数を呼び出していると思います。このenv関数は、第一引数の環境変数を取得し、存在しない場合は第二引数の値を返す、というものです。

デフォルトで既に、重要な設定値はenv関数を通すようになっているので、下記のテンプレートファイルを参考に.envファイルを作成・配置すれば、もうアプリケーションの環境設定が.envファイルで出来ている状態になるでしょう。

# app settings
export APP_NAME=app
export APP_ENCODING="UTF-8"
export APP_DEFAULT_LOCALE="ja_JP"

# some general configuration for cakephp
export DEBUG=true
export SECURITY_SALT="[セキュアなランダム文字列]"
export SECURITY_CIPHER_SEED="[乱数]"

# database connection information
export DATABASE_URL="mysql://user:password@localhost/test_database_name?encoding=utf8"
export DATABASE_TEST_URL="mysql://user:password@localhost/test_database_name?encoding=utf8"

# a simple email adapter
export EMAIL_URL="mail://localhost/?from=you@localhost"
export EMAIL_SMTP_URL=smtp://user:secret@localhost:25/?from[site@localhost]=My+Site&timeout=30
export EMAIL_FAST_URL=smtp://user:secret@localhost:25/?from=you@localhost&messageId=1&template=0&layout=0&timeout=30

もちろん、これは例なので、上記にない環境変数も追加すれば設定できますし、config/app.phpを編集すれば好きなパラメーターを.env経由で設定できるようになります。

まとめ

たかが設定ファイル、されど設定ファイル。

設定ファイルひとつでデプロイの手間が全然違ってきたりします。もし、あまり気にしたことのないのであれば、これを機に見直してみてはいかがでしょうか。

筆者について

フリーランスエンジニアとして活動している、「もりやませーた」です。

筆者のTwitterはこちら。記事に関するご意見等はTwitterの方へお寄せください。

その他業務に関するお問い合わせは、こちらのページをご覧ください。

PHP OSS