Laravelの.envは、ご存知のように実行する環境により中身が違ってきます。その環境の種類を設定するのがAPP_ENVの環境変数です。今回はそのお話です。

設定値

Laravel以下のように.envファイル内でいろいろな環境変数の設定ができます。

APP_NAME=Laravel
APP_ENV=local # これが今回の主人公
APP_KEY=
APP_DEBUG=true
..

その中で、APP_ENVの値はどの環境であるかを設定します。既存値としては、local あるいは production の2つあります。ローカルの開発環境あるいはライブの環境です。しかし、必要ならば自分で好きな値で設定しています。私らのステージングサーバでは、stagingの値を使用しています。

また、.envでは指定しないですが、ユニットテスト実行のときに自動的に testing という値が設定されます。これは、phpunit.xmlの以下で設定しています。

...
  <php>
    <env name="APP_ENV" value="testing"/>
    <env name="APP_URL" value="https://localhost"/>
...

どの環境か判断

さて、プログラムの中でどの環境で現在実行されているかを、どのように判断するかというと、これ意外とバリエーションあります。

最近まで私が使用していたのは、

if (config('app.env') === 'production') {
    //
}

config()のヘルバーは他の環境変数でも使えるので重宝します。

しかし、マニュアルを見ると、以下のようにAppのファサードのメソッドを使っています。

if (App::environment('production')) {
    //
}

これ知らなかったなあ。しかも、複数の環境のテストも可能です。stagingあるいはproductionなら、

if (App::environment(['staging', 'production'])) {
    //
}

さらに、こんなのもありです。

if (App::isProduction()) {
    //
}

このバリエーションには、ローカル環境のチェックもあります。

if (App::isLocal()) {
    //
}

さて、テスト環境はなんだと思いますか?

if (App::runningUnitTests()) {
    //
}

残念、App::isTesting()ではなかったですね。

それから、Appのファサードを使用しなくても、app()のヘルパーを使用しても同様です。例えば、

if (app()->isProduction()) {
    //
}

最後に

環境変数と関係ないですが、コマンドラインでLaravelを実行しているときは、以下でチェックできます。

if (App::runningInConsole()) {
    //
}

tinkerで実行したら、

>>> App::runningInConsole()
=> true

By khino