8.

Laravel「Dotenv values containing spaces must be surrounded

編集
この記事の要点
  • Laravel の Dotenv values containing spaces must be surrounded by quotes
  • 原因: .env ファイルで値にスペースを含めているがクォートで囲っていない
  • 対処: APP_NAME="My App" のようにダブルクォートで囲む
  • 変更後は php artisan config:clear でキャッシュをクリア
  • スペース以外にも #(コメント開始)/ $(変数展開)/ 改行に注意

エラー内容

Laravel アプリを起動・実行時(php artisan serve や Web リクエスト時)に以下が発生:

RuntimeException
  Dotenv values containing spaces must be surrounded by quotes.

  at vendor/vlucas/phpdotenv/src/Loader/Parser.php:nnn

原因

.env ファイルで値にスペースを含むテキストをクォートなしで書いているのが原因:

# ❌ NG: スペースを含むのにクォートが無い
APP_NAME=My Awesome App
MAIL_FROM_NAME=Customer Support

# ❌ NG: クォートのバランスが崩れている
APP_NAME="My App

# ❌ NG: シングルクォートとダブルクォートの混在
APP_NAME='My App"

対処

スペースを含む値はダブルクォートで囲む:

# ✅ OK: ダブルクォートで囲む
APP_NAME="My Awesome App"
MAIL_FROM_NAME="Customer Support"
APP_TIMEZONE="Asia/Tokyo"
APP_DESCRIPTION="サービスの説明文 ← 日本語スペースなくても安全のためクォート推奨"

# ✅ OK: スペースが無い値はクォート不要
APP_ENV=production
APP_DEBUG=false
DB_HOST=127.0.0.1

変更後は config:clear

.env はキャッシュされるため、修正後はキャッシュをクリアします:

php artisan config:clear

# 全部消したいとき
php artisan optimize:clear

# 本番では逆に config:cache でキャッシュを再生成
php artisan config:cache

シングルクォート vs ダブルクォート

ダブルクォート ""シングルクォート ''
変数展開${APP_NAME} が展開される× リテラル文字列
エスケープ\n\" が有効すべてそのまま
用途動的な値、他の変数を含む固定文字列、パスワード等
# 変数展開の例
APP_URL=https://example.com
APP_ASSET_URL="${APP_URL}/assets"  # → https://example.com/assets
# シングルクォートだと展開されない
APP_BAD='${APP_URL}/assets'        # → ${APP_URL}/assets (リテラル)

クォートが必要なケース

  • スペース: APP_NAME="My App"
  • # (コメント記号): PASSWORD="abc#123"(クォートなしだと abc までしか読まれない)
  • $ (変数展開): 展開させたくない場合は' を使う
  • =(イコール): DB_PASSWORD="a=b=c"
  • 日本語: 一般的には不要だが、文字化け対策で囲むのが無難

複数行・改行を含めたい場合

.env での改行サポートはバージョン依存。Laravel 8 以降は " 内での改行を改行として扱う:

# Laravel 8+ で動作(.env 内に直接改行)
PRIVATE_KEY="-----BEGIN PRIVATE KEY-----
MIIE...
-----END PRIVATE KEY-----"

# 互換性重視: 改行を \n でエスケープ
PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\nMIIE...\n-----END PRIVATE KEY-----"

config('xxx') 経由で取得

.env 値を直接 env('APP_NAME') で取らずに、config/app.php 経由で config('app.name') を使うのが Laravel 流:

// config/app.php
'name' => env('APP_NAME', 'Laravel'),  // .env が無いとデフォルト

// 各所で
config('app.name');         // 推奨
env('APP_NAME');            // 非推奨(config 外では空になる場合あり)

本番環境で php artisan config:cache を実行すると env()config 外では null を返すようになります(仕様)。config 経由が安全。

関連エラー

  • "Failed to parse dotenv file" — 構文エラー全般。クォートのバランス・改行コードを確認
  • "Encryption key (APP_KEY) not specified"APP_KEY= が空 → php artisan key:generate
  • 「設定値が反映されない」 — config キャッシュ → php artisan config:clear
  • ".env のキー名に小文字が混在」 — Dotenv は大文字のみを推奨(小文字キーは警告またはエラー)

予防

  • .env.example を必ずバージョン管理して、新メンバーがコピー → 設定変更だけで動かせるように
  • .env.gitignore に必ず登録(機密情報のため)
  • 本番デプロイ時は CI/CD で .env を安全に注入(GitHub Actions Secrets / AWS SSM 等)
  • パスワードに #(シャープ)を含めないのが安全(バリデーション側に制約をかける)
編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. SQLSTATE[HY000] [1045] Access denied for user 'homestead'@'localhost'
  2. Add [~] to fillable property to allow mass assignment on [App\~].
  3. PHP Parse error: syntax error, unexpected 'class' (T_CLASS), expecting identifier (T_STRING) or variable (T_VARIABLE) or '{' or '$' in ~
  4. Changing columns for table "~" requires Doctrine DBAL; install "doctrine/dbal"
  5. MethodNotAllowedHttpException No message
  6. Class 'Doctrine\DBAL\Driver\PDOMySql\Driver' not found
  7. production.ERROR: No application encryption key has been specified.
  8. Dotenv values containing spaces must be surrounded by quotes.
  9. Laravel \ Socialite \ Two \ InvalidStateException
  10. The page has expired due to inactivity. Please refresh and try again.
  11. Failed to clone https://github.com/symfony/thanks.git via https, ssh protocol
  12. Illegal offset type
  13. Cannot access protected property Illuminate\Http\Request::$...
  14. Emitted value instead of an instance of Error
  15. 画像保存時にInternal Server Error
  16. Failed to authenticate on SMTP server with username ...
  17. PostTooLargeException
  18. Database hosts array is empty.
  19. Invalid request (Unsupported SSL request)
  20. does not comply with psr-4 autoloading standard. Skipping.
  21. MySQLのSTR_TO_DATE関数を使用するとnullが返却される問題