【Laravel】.envファイルとconfigヘルパを知る

もくじ

.envファイルとは

Laravelにおける設定をまとめたファイルのことです。

envは environment の短縮形で「環境」という意味です。

.envファイルにはキーと値のペアが記述されており、それらのペアはconfigディレクトリ以下の各種機能の設定ファイルの中で利用されます。

ファイル変更したら更新コマンドを実行

.envファイルを変更するだけではアプリに反映されません。

反映するために以下のコマンドを実行します。

$ php artisan config:clear

これを実行することで変更した内容が反映されます。

意外にコマンド実行を忘れて設定が反映されずに頭を抱えることも少なくありませんので、念頭に置いておきましょう。

次項から各キーについて説明していきますが、設定を変更して確認する際には必ず実行してください。

環境変数.envファイルで管理

dev環境や本番環境など、環境の違いによって.envファイルは初めから違う値を設定していると思います。したがって、環境変数.envファイルで管理すべきです。

/config/XXXXX.phpenv()ヘルパを用いることで.envファイルを読み込みに行きますが、/config/XXXXX.phpに直接書いてしまうと環境によって値を変えることができません。

たとえば/config/session.phpsecureをみてみます。

'secure' => true,
SESSION_SECURE_COOKIE=true

これらはここだけを見ると同じ意味になります。

しかしこのsecure属性は以下のようにすることがほとんどでしょう。

  • dev環境ではfalse
  • 本番環境ではtrue

環境によって違いを持たせられるのは.envファイルです。

すなわち/config/session.phpに直接値を指定してしまうとどの環境でもtrueになってしまいますが、.envファイルを読み込むようにしておけば環境を考慮した設定ができるのです。

'secure' => env('SESSION_SECURE_COOKIE'),

※Laravelの初期値はこうなっています。今回説明のために変更しました。

env()ヘルパとconfig()ヘルパ

env()ヘルパはコントローラーやモデルなどの中で直接使いません。

コントローラー等で使用する場合は、まずconfigディレクトリにあるファイルの中でenv()ヘルパの値を入れて設定しておき、コントローラー等ではconfig()ヘルパを用いて参照します。

return [
    // configに.envのキー名を入れる。
    'my-env' => env('MY_ENV'),
];
$my_env = config('my-app.my-env');

このように、config()ヘルパでファイル名と変数名を用いて参照できます。

config('[configファイル名].[変数名]')

何故直接env()を使ってはいけないのか

コントローラー等で直接env()ヘルパを使ってはいけない理由は、本番環境でconfig:cacheコマンドを実行した際.envファイルを読み込まないためです。
読み込む前にconfigのキャッシュの有無を確認し、キャッシュがあった場合は.envファイルを読み込まない仕様になっています。

・・・ってどういうこっちゃ?になりますよね。どういうことかもう少し噛み砕きます。

config配下以外でenv()ヘルパを使用すると、.envの値(環境変数)を取得しようとするとき.envファイルをロードせずnullが返ってきます。
それを回避するために一度config()ヘルパをはさむことで.envの値を取得します。

各キーについて

.envファイルには複数のキーに対してそれぞれ値が記述できます。

APP_NAME:サイト名

開発しているサイトの名前を設定できます。

APP_NAMEが利用されているファイルは、以下の2つです。

/config/cache.php
/config/session.php

APP_ENV: 環境名

開発しているサイトの実行環境を指定します。

以下のようなものがよく使われるでしょう。

  • local … ローカル(開発)
  • dev … 開発
  • staging … ステージング
  • production … 本番

APP_ENVで指定した環境は以下のようなコードに影響します。

$env = app()->environment();

APP_KEY: 暗号化に使われるキー

Laravelがインストールされると各自ランダムで作成されます。

暗号化に関連する以下の場面で利用されています。

  • encrypt()decrypt()など暗号化/復号する
  • パスワード・リマインダーで使われるトークンをつくる

このキーは以下のコマンドを実行することで変更することができます。

$ php artisan key:generate

自動で.envファイルが変更されます。

APP_DEBUG

エラーがあった場合に、エラー詳細をデバッグするかどうかです。

値はtruefalseを指定します。

APP_DEBUG=true

APP_DEBUG=true

f:id:bonoponz:20210121134617p:plain

APP_DEBUG=false

APP_DEBUG=false

f:id:bonoponz:20210121134718p:plain

falseだとなぜエラーなのか教えてくれませんが、本番環境の場合はユーザが知る必要のない(ユーザに知られてはいけない)情報なので「ページを表示できない」ということだけを知らせてくれるメリットがあります。

APP_URL: サイトのURL

サイトのURLに関連する部分で利用されています。

config('app.url')

LOG_CHANNEL: ログ情報の設定

インストールしたままであればLOG_CHANNEL=stackになっているでしょう。stackがデフォルト値であり、.envファイルのLOG_CHANNELの設定がなければstackに設定されます。

stack以外にsingleチャネルやdailyチャネル、slackチャネルなどがあります。チャネルによってログメッセージを処理する方法が異なりますので、詳細は他の記事で調べてみてください。

参考URL:Laravelのログ設定を理解する | アールエフェクト

DB_*****: データベースへの接続情報

DB_CONNECTION

利用するデータベースの種類を指定します。

config/database.phpconnectionsにデフォルトで選べるデータベースがあります。

DB_HOST

データベースのホストです。

127.0.0.1localhostが多いでしょうか。

DB_PORT

データベースが利用するポート番号です。

DB_DATABASE

利用するデータベース名です。

DB_USERNAME

利用するデータベース名にアクセスするユーザー名です。

DB_PASSWORD

利用するデータベース名にアクセスするパスワードです。

BROADCAST_DRIVER: ブロードキャスト設定

ブロードキャストの種類を設定する項目です。

CACHE_DRIVER: キャッシュ方式

Laravelで扱えるキャッシュは以下の6種類です。

デフォルト値はfileです。fileはファイルベースでのキャッシュを行います。

参考URL:Laravelのキャッシュを用いてDB負荷の削減と高速化を行う(入門/導入編)

QUEUE_CONNECTION: キュー方式

利用するキューの方式を設定する項目です。

bonoponz.hatenablog.com

SESSION_*****: セッション関連

SESSION_DRIVER

利用するセッションの方式を設定する項目です。

SESSION_LIFETIME

セッションの継続時間(分)です。デフォルトは120(分)です。

ただし、php.inisession.gc_maxlifetimesession.cookie_lifetimeの値がこれよりも短い場合は、そちらが優先されますので注意です。

MAIL_*****: メール関連

MAIL_DRIVER

メール送信方式を指定します。

MAIL_HOST

メールサーバーのホスト名を指定します。

MAIL_PORT

メールサーバーのポート番号を指定します。

MAIL_USERNAME

メールサーバーのユーザ名を指定します。

MAIL_PASSWORD

メールサーバーのパスワードを指定します。

MAIL_ENCRYPTION

tslsslなどのメールを暗号化するプロトコルを指定します。

その他

初期値では設定されていない項目も多々あるようです。

AWSの接続設定なども.envファイルから指定できます。

いろいろ活用してみましょう!

参考URL

入門者のためのLaravel .envファイルの基礎と理解 | アールエフェクト

保存版!Laravelの.envでできること大全 – console dot log

Laravel の .env の値は config() 経由で使う - Hiroto's diary

Laravelの.envについて調べてみた - 株式会社クイックのWebサービス開発blog