.env
ファイルの代わりにJSONを使って環境変数を設定します。
JSON schemaによるバリデーションにより、環境変数の値を検証します。
.env
からJSONフォーマットへの移行ツールcomposer require koriym/env-json
// 環境変数の読み込みとバリデーション
$env = (new EnvJson())->load(__DIR__);
// オブジェクトプロパティとしてアクセス
echo $env->DATABASE_URL;
// または従来のgetenv()を使用
echo getenv('DATABASE_URL');
型、説明、制約条件付きで環境変数を定義します:
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"required": [
"DATABASE_URL", "API_KEY"
],
"properties": {
"DATABASE_URL": {
"description": "データベース接続文字列",
"pattern": "^mysql://.*"
},
"API_KEY": {
"description": "外部APIの認証キー",
"minLength": 32
},
"DEBUG_MODE": {
"description": "デバッグ出力を有効にする (true/false)",
"enum": ["true", "false"],
"default": "false"
},
"PORT": {
"description": "サーバーポート番号",
"pattern": "^[0-9]+$",
"default": "3000"
}
}
}
実際の設定値:
{
"$schema": "./env.schema.json",
"DATABASE_URL": "mysql://user:pass@localhost/mydb",
"API_KEY": "1234567890abcdef1234567890abcdef",
"DEBUG_MODE": "true",
"PORT": "8080"
}
環境変数は常に文字列として扱われます。JSONスキーマで非文字列型を指定すると検証エラーが発生します。
{
"DEBUG_MODE": {
"type": "boolean",
"default": false
},
"PORT": {
"type": "integer",
"default": 3000
},
"TIMEOUT": {
"type": "number",
"default": 30.5
}
}
エラーメッセージ: 値は文字列(例: “3000”)になりますが、スキーマは整数を期待するため、検証に失敗します。
{
"DEBUG_MODE": {
"description": "デバッグ出力を有効にする (true/false)",
"enum": ["true", "false"],
"default": "false"
},
"PORT": {
"description": "サーバーポート番号",
"pattern": "^[0-9]+$",
"default": "3000"
},
"TIMEOUT": {
"description": "タイムアウト時間(秒)",
"pattern": "^[0-9]+(\\.[0-9]+)?$",
"default": "30.5"
}
}
真偽値:
"FEATURE_ENABLED": {
"enum": ["true", "false"],
"default": "false"
}
数値:
"TIMEOUT": {
"pattern": "^[0-9]+$",
"default": "30"
}
列挙値:
"LOG_LEVEL": {
"enum": ["debug", "info", "warning", "error"],
"default": "info"
}
env.schema.json
で定義env.dist.json
に定義(gitリポジトリにコミット可能)env.json
に定義(.gitignore
に追加)env.json
を読み込みenv.json
が存在しない場合、env.dist.json
にフォールバックenv.dist.json
を削除(本番では不要)env.json
は含めない(.gitignore
に追加済み)既存の.env
ファイルをJSON形式に変換:
bin/ini2json .env
これによりenv.schema.json
とenv.dist.json
の両方が生成されます。
envjson
コマンドラインツールは様々な環境との連携をサポートします:
# 現在のシェルに変数を読み込む
source <(bin/envjson)
# カスタムディレクトリを指定
source <(bin/envjson -d ./config)
# PHP-FPM形式で出力: env[FOO] = "foo1"
bin/envjson -d ./config -o fpm > .env.fpm
# INI形式で出力: FOO="foo1"
bin/envjson -d ./config -o ini > env.ini
# シェル形式で出力: export FOO="foo1"
bin/envjson -d ./config -o shell > env.sh
-d --dir=DIR envファイルを含むディレクトリ(デフォルト: カレントディレクトリ)
-f --file=FILE 読み込むJSONファイル名(デフォルト: env.json)
-o --output=FMT 出力形式: shell, fpm, ini(デフォルト: shell)
-v --verbose 詳細メッセージを表示
-q --quiet 警告メッセージを抑制
-h --help ヘルプメッセージを表示