Laravelで使われているApp::environmentが何をしているかについて。
App::environmentとは何か?
App::environmentは、Appファサードのenvironmentメソッドで、現在のプロジェクトの.envファイル(環境設定ファイル)の中の、APP_ENVの値を取得・調査してくるメソッドです。
使い方は大きく2つあります。
- APP_ENVの値を取得
- 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 | その他の例 | その他の例 |
---|---|---|---|
開発環境 | local | dev | development |
ステージング環境 | staging | stg | |
本番環境 | production | prod |
この値を設定したことで、本番環境に切り替わるわけではありません。
この値を設定している.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を使う場合
docker-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項目の環境に関する設定を記述します(デフォルトの場合)
すべての項目を設定する必要はなく、必要な項目の値のみを設定します。
また、独自のAPIを利用する場合など、自分で環境変数を作成し.envファイルに追加することもできます。
.envファイルがどのように作成されるか?
Laravelには.envファイルの元になる、 .env.example というファイルがデフォルトで用意されています。
.env.exampleはルーティディレクトリ直下に配置してあります。
composerでLaravelのプロジェクトを作成すると、この.env.exampleファイルをコピーして、.envファイルを作成します。
作成したプロジェクトではその.envファイルが使用されます。
#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ファイルで設定する環境になります。
環境変数を読み込むプログラムは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