
执行 `php artisan config:cache` 后,`env()` 函数失效是正常行为;此时应统一通过 `config()` 辅助函数访问配置值,而非直接调用 `env()`。
在 Laravel 8 中,运行 php artisan config:cache 会将所有配置文件(如 config/database.php、config/mail.php 等)编译为一个高度优化的 PHP 数组并写入 bootstrap/cache/config.php。该过程会“快照”当前环境变量的值(即 .env 中的 DB_HOST、MAIL_HOST 等),并将它们内联到配置数组中——但此后 env() 函数本身会被 Laravel 强制返回 null(出于安全与性能考虑)。因此:
- ✅ 邮件能正常发送:因为 config:cache 已将 .env 中的 MAIL_* 值固化进配置,Mail 组件通过 config('mail.driver') 等方式读取,完全不受影响;
- ❌ env('DB_HOST') 返回 null:因为 Laravel 在缓存配置后禁用了运行时 env() 调用,防止意外暴露敏感信息或造成配置不一致。
正确做法:始终使用 config() 替代 env()
在应用代码中(控制器、服务类、任务等),禁止在运行时直接调用 env()。应通过配置键访问已缓存的值:
// ✅ 正确:从已缓存的配置中读取
$host = config('database.connections.mysql.host'); // 对应 .env 中 DB_HOST
$port = config('database.connections.mysql.port'); // 对应 DB_PORT
$mailFrom = config('mail.from.address'); // 对应 MAIL_FROM_ADDRESS? 提示:配置键路径遵循 config/{file}.php 的数组结构。例如 config/database.php 中 'connections' => ['mysql' => [...]],对应键即为 'database.connections.mysql.host'。
⚠️ 注意事项与最佳实践
- 不要在配置文件外使用 env():.env 仅用于启动阶段初始化配置,Laravel 官方明确要求「所有运行时逻辑必须依赖 config()」;
- 本地开发可不缓存:config:cache 主要用于生产环境提升性能,开发阶段建议保持未缓存状态(避免反复清缓存);
- 修改 .env 后必须重缓存:若更新了环境变量,需先 config:clear,再 config:cache,否则旧值仍生效;
- 自定义配置也需遵循规则:如你创建了 config/custom.php,同样应通过 config('custom.key') 访问,而非 env('CUSTOM_KEY')。
总结
config:cache 不是“禁用环境变量”,而是将环境变量一次性注入配置系统,从而实现高性能与安全性平衡。坚持“.env → 配置文件 → config()”这一单向数据流,是 Laravel 稳健部署的关键原则。










