【Laravel】App::environmentとは何か?現在のAPP_ENVの値を調べる方法

laravel-what-is-app-environmentLaravel

Laravelで使われているApp::environmentが何をしているかについて。

App::environmentとは何か?

App::environmentは、Appファサードのenvironmentメソッドで、現在のプロジェクトの.envファイル(環境設定ファイル)の中の、APP_ENVの値を取得・調査してくるメソッドです。

使い方は大きく2つあります。

  1. APP_ENVの値を取得
  2. APP_ENVの値を調査

APP_ENVの値を取得する

引数に何も指定しなければ、APP_ENVの値を取得してきます。

App::environment();

use Illuminate\Support\Facades\App;

$environment = App::environment();

APP_ENV=local となっている場合は、変数$environmentに local が入ります。


APP_ENVの値を調査する

引数に文字列を入力すると、その値がAPP_ENVの値と一致している時は、trueを、異なる場合はfalseを返します。

App::environment(‘文字列’);

if (App::environment('local')) {
    $var = 処理1;
} else {
    $var = 処理2;
}

処理が1行で記述できる場合は、次の記述も使えます。

$var = App::environment('local') ? 処理1 : 処理2;


APP_ENVの値を複数設定する

引数を配列形式で指定すれば、複数の値を指定することができます。

App::environment([‘文字列1’, ‘文字列2’])

if (App::environment(['local', 'staging'])) {
    // APP_ENVがlocalかstagingの場合の処理
}


(参考)Laravel8 環境設定

APP_ENVとは?

APP_ENVとはLaravelの環境設定用のファイル .env*の中に記述されている、現在の開発環境を格納する環境変数です。

例えば開発環境であれば、localと記載します。クオテーションは不要です。(デフォルトがlocalになっています)

APP_ENV=local

値は自分で好きに設定することができます。よく使われるのは以下です。

環境例1その他の例その他の例
開発環境localdevdevelopment
ステージング環境stagingstg
本番環境productionprod

この値を設定したことで、本番環境に切り替わるわけではありません。

この値を設定している.envファイルに、本番環境で使うデータベースやAPIとの接続設定を記述したり、デバッグモードのON・OFFを記述することで、環境の切り分けを行います。

現在のAPP_ENVの値を確認する方法

現在の環境におけるAPP_ENVの値を確認するには以下のコマンドを実行します。

$ php artisan env

$ php artisan env
Current application environment: local


環境による.envファイルの切り分け方法

環境毎の.envファイルの作成

開発環境、ステージング環境、本番環境ごとに、接続するデータベースやAPIを切り分ける場合は、各環境用に複数の.envファイルを用意します。

ファイル名を、 .env.環境名 とします。

環境名は任意なので好きな名前をつけることができます。また、ファイルの中の APP_ENVの値と合わせる必要はありません。

▼.envファイル名の例

ファイル名内容
.env.local開発環境1で使うファイル
.env.developent開発環境2で使うファイル
.env.stagingステージング環境で使うファイル
.env.production本番環境で使うファイル

Laravelを構築するときに、どの環境ファイルを使うかを指定すれば、その値を使って構築することができます。

それぞれをどう使うかはプロジェクト毎に自由に設定します。例えば、以下のような切り分けができます。

  • .env.local は開発環境のgitブランチを使って、ローカルのDBと接続する。
  • .env.development は開発環境のgitブランチを使ってステージングのDBと接続する。
  • .env.staging はステージングのgitブランチを使って本番環境のDBと接続する。
  • .env.production は本番環境のgitブランチを使って本番環境のDBと接続する。

環境毎の.envファイルの読み込み

artisanコマンドを使う場合

マイグレーションのときに読み込む.envファイルを指定することができます。
※マイグレーションするべきファイルが存在しない場合はNothing to migrate. と表示されます。

$ php artisan migrate --env=設定した環境名

–env= の後ろの設定した環境名には、 ファイル名の.env. に続く部分を入れます。

例えば、.env.staging を読み込む場合は次のようになります。

$ php artisan migrate --env=staging


docker-composeを使う場合

dokcer-compose.ymlを使ってLaravelの環境を構築する場合は、env_file というディレクティブを指定してそこにファイルパスを記述します。

なお、environmentディレクティブを使って、指定した環境変数の値をセットすることもできます。

  local:
    build:
      context: ./
      dockerfile: docker/local/Dockerfile
    container_name: laravle_local
    tty: true
    ports:
      - 81:80
    env_file:
      - .env.local
    volumes:
      - .:/app/

なお、environmentディレクティブを使って、指定した環境変数の値をセットすることもできます。

  local:
    build:
      context: ./
      dockerfile: docker/local/Dockerfile
    container_name: laravle_local
    tty: true
    ports:
      - 81:80
    env_file:
      - .env.local
    environment:
      - APP_ENV=local
      - APP_DEBUG=true
    volumes:
      - .:/app/


.envファイルとは

Laravelの.envファイルはLaravelの開発環境を指定するファイルです。

.envファイルで設定する9個の項目

具体的には次の9項目の環境に関する設定を記述します(デフォルトの場合)

.envファイルで指定する環境
  1. プロジェクトの設定
  2. ログファイルの設定
  3. データベースの設定
  4. クッキーやセッション情報の設定
  5. Memcachedの設定(メモリキャッシュサーバーの1種)
  6. Redisの設定(NoSQLデータベースの1種)
  7. メールサーバーの設定
  8. AWSの設定
  9. Pusherの設定(Websocletを利用した双方向通信APIサービス)


すべての項目を設定する必要はなく、必要な項目の値のみを設定します。

また、独自のAPIを利用する場合など、自分で環境変数を作成し.envファイルに追加することもできます

.envファイルがどのように作成されるか?

Laravelには.envファイルの元になる、 .env.example というファイルがデフォルトで用意されています。

.env.exampleはルーティディレクトリ直下に配置してあります。

composerでLaravelのプロジェクトを作成すると、この.env.exampleファイルをコピーして、.envファイルを作成します。

作成したプロジェクトではその.envファイルが使用されます。

(参考)Laravel公式 インストール方法

#Laravelプロジェクトの作成方法
composer create-project laravel/laravel example-app
cd example-app
php artisan serve

デフォルトの.envファイルの中身は次のようになります。(.env.exampleの中身)

APP_NAME=example-app
APP_ENV=local
APP_KEY=
APP_DEBUG=true
APP_URL=http://localhost

LOG_CHANNEL=stack
LOG_LEVEL=debug

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=

BROADCAST_DRIVER=log
CACHE_DRIVER=file
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120

MEMCACHED_HOST=127.0.0.1

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

MAIL_MAILER=smtp
MAIL_HOST=mailhog
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS=null
MAIL_FROM_NAME="${APP_NAME}"

AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=

PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=
PUSHER_APP_CLUSTER=mt1

MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"

設定の項目毎にグルーピングしてスペースで区切られています。これが前述した.envファイルで設定する環境になります。

.envファイルで指定する環境
  1. プロジェクトの設定
  2. ログファイルの設定
  3. データベースの設定
  4. クッキーやセッション情報の設定
  5. Memcachedの設定(メモリキャッシュサーバーの1種)
  6. Redisの設定(NoSQLデータベースの1種)
  7. メールサーバーの設定
  8. AWSの設定
  9. Pusherの設定(Websocletを利用した双方向通信APIサービス)

環境変数を読み込むプログラムはLoadEnvironmentVariables.phpファイルに記述されています。

▼ファイルパス
vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/LoadEnvironmentVariables.php

.envファイルの注意点

.envファイルに関するよくありがちな失敗に、ファイルを変更しても設定が反映されないことがあります。

.envファイルが読みこまれなくなる原因

多くの場合、php artisan config:cache を実行したことが原因であることが多いです。

php artisan config:cacheを実行すると、Laravelはキャッシュファイルを作成し、.envファイルを読み込みに行かない設定になります。

これは開発環境など、頻繁に設定変更を行う必要がなく、少しでも処理スピードを上げたい場合には有効です。ですが、開発環境で実行すると混乱の元になります。

キャッシュ生成コマンドを実行して、.envファイルを読みに行かなくする設定はLoadEnvironmentVariables.phpに記述があります。

<?php

namespace Illuminate\Foundation\Bootstrap;

use Dotenv\Dotenv;
use Dotenv\Exception\InvalidPathException;
use Symfony\Component\Console\Input\ArgvInput;
use Illuminate\Contracts\Foundation\Application;

class LoadEnvironmentVariables
{
    /**
     * Bootstrap the given application.
     *
     * @param  \Illuminate\Contracts\Foundation\Application  $app
     * @return void
     */
    public function bootstrap(Application $app)
    {
        if ($app->configurationIsCached()) { // キャッシュされているとそもそも.envを読みに行かない
            return;
        }

        // コンソールから実行されているのか、サーバー環境変数がセットされているかチェックする
        $this->checkForSpecificEnvironmentFile($app);

        try {
            // .env か .env.{APP_ENV} か loadEnvironmentFrom()で指定したファイルを読み込む
            (new Dotenv($app->environmentPath(), $app->environmentFile()))->load(); 
        } catch (InvalidPathException $e) {
            //
        }
    }

    /**
     * Detect if a custom environment file matching the APP_ENV exists.
     *
     * @param  \Illuminate\Contracts\Foundation\Application  $app
     * @return void
     */
    protected function checkForSpecificEnvironmentFile($app)
    {
        // artisanコマンドの時はここで判別される
        if ($app->runningInConsole() && ($input = new ArgvInput)->hasParameterOption('--env')) {
            if ($this->setEnvironmentFilePath(
                $app, $app->environmentFile().'.'.$input->getParameterOption('--env')
            )) {
                return;
            }
        }

        if (! env('APP_ENV')) { // サーバー環境変数が設定されてなければreturn
            return;
        }

        $this->setEnvironmentFilePath( // 読み込み先を.env.{APP_ENV}とする
            $app, $app->environmentFile().'.'.env('APP_ENV')
        );
    }

    /**
     * Load a custom environment file.
     *
     * @param  \Illuminate\Contracts\Foundation\Application  $app
     * @param  string  $file
     * @return bool
     */
    protected function setEnvironmentFilePath($app, $file)
    {
        if (file_exists($app->environmentPath().'/'.$file)) {
            $app->loadEnvironmentFrom($file);

            return true;
        }

        return false;
    }
}

(引用)https://qiita.com/mmmmmmanta/items/b992c7d8cd69343b6626

.envファイルを読み込ませる方法

.envファイルの変更を反映したい場合は再度キャッシュさせるコマンドを実行すれば、現時点での設定内容で新たにキャッシュが作成されます。

php artisan config:cache

そもそも、キャッシュさせることをやめて、毎回読み込むようにしたい場合は、キャッシュをクリアします。

php artisan cache:clear

タイトルとURLをコピーしました