Laravel には、アプリケーションの設定を環境によって切り替える機構があります。これを使うことで、開発環境、ステージング環境、本番環境、テスト環境で設定を切り替えることができます。
ここでは、Laravel 4.2 を対象とします。
環境設定の指定
環境設定の指定は、bootstrap/start.php
の以下の箇所で行ないます。デフォルトでは、ホスト名がhomestead
の場合はlocal
、それ以外はproduction
となります。
$env = $app->detectEnvironment(array( 'local' => array('homestead'), ));
このdetectEnvironment
メソッドでは、クロージャが引数の場合、その戻り値を環境設定として扱うことができます。
私は、環境変数での切替の方が扱いやすいので、LARAVEL_ENV
という環境変数の値を取得して、それを環境設定としています。環境変数に指定が無ければ、local
をデフォルトの設定としています。
$env = $app->detectEnvironment(function () { if (getenv('LARAVEL_ENV')) { return getenv('LARAVEL_ENV'); } return 'local'; });
環境変数であれば、Web サーバの設定なり、シェルの設定なり、アプリケーションの外から渡すことが容易なので、柔軟に設定を切り替えることができます。
例えば、あるプロジェクトでは、本番へのデプロイ時に.htaccess
を動的に生成して、その中でSetEnv LARAVEL_ENV production
を記述するタスクを自動実行するようにしています。また、Heroku 環境では、アプリケーションに環境変数が設定できるので、そこでLARAVEL_ENV=heroku
を設定しています。
環境ごとの設定
環境ごとの設定は、設定ファイルのディレクトリを作成することで指定することができます。
まず、メインとなるのが、app/config/
以下の設定です。ここに上記で指定した環境設定をディレクトリとして作成して、その下に設定ファイルを設置すると、それが読み込まれます。
app/config/ + local/ <--- local 用設定 + app.php ... + production/ <--- production 用設定 + app.php ... + heroku/ <--- heroku 用設定 + app.php ...
設定は、まず、デフォルト(app/config/
直下)の各ファイルが読み込まれ、環境ごとのディレクトリにある設定ファイルの内容がそれに上書かれるという動作になります。よって、環境ごとのディレクトリには、デフォルトから変更の必要があるファイルのみ設置します。また、設置したファイルでも全ての要素を記述する必要はなく、変更が必要なもののみ記述します。
例えば、app/config/app.php
はデフォルトのままの場合、app/config/local/app.php
では下記のように記述します。
この設定では、app.php
の debug
と provider
について変更を行っています。debug
は true
に変更しています。providers
では、デフォルトの値は全て有効にして、追加のみ行ないたいので、append_config
関数で追加する ServiceProvider のみ指定しています。
このように変更差分にのみ記述することで、最小限の記述で環境ごとに設定値を変えることができます。
<?php return [ 'debug' => true, 'providers' => append_config([ 'BarryvdhLaravelIdeHelperIdeHelperServiceProvider', 'WayGeneratorsGeneratorsServiceProvider', ]), ];
利用している環境設定
よく利用している環境設定は以下です。
- local = Vagrant VM 開発環境用。
debug=true
、IdeHelper や Generator など開発用 ServiceProvider を組み込む。 - production = 本番環境用。
debug=false
で、開発用 ServiceProvider は除外。暗号キーは、専用のものに。 - statging = ステージング環境用。ほぼ本番環境で、
url
などを変更。 - heroku = Heroku環境用。Heroku では、各種アドオンとの接続情報を環境変数から得るので、そのあたりを各設定ファイルに記述。
- testing = 自動テスト環境用。テスト用データベース設定など。これはフレームワークで予約されており、テスト実行時には自動で指定される。
artisan コマンド
artisan コマンドでも同じフローで環境が決定されるのですが、それとは別に--env
オプションで指定することができます。
下記のように local
環境においても、--env=production
を指定すると production
環境で実行することができます。
$ php artisan env Current application environment: local $ php artisan env --env=producion Current application environment: producion
さいごに
Laravel の環境設定について見てみました。
多様な環境について設定を切り替える機構は便利なもので、とても重宝しています。
いまは環境変数での指定に落ち着いていますが、staging などで、artisan コマンド実行時に--env
を指定する手間を省くために、.laravel_env
のような環境を指定するファイルを用意して、そこに環境設定を記述して、それを読み込むというようなことも考えています。(.laravel_env は .gitignore して、デプロイ時に自動生成する想定。)
.laravel_env
があればそれを使い、無ければ環境変数から読むという流れです。
どのように環境を決定するかということも、アプリケーションで柔軟に変更できるというのも良くできているところですね。