使用 env('APP_ENV')、config('app.env') 或 App::environment() 获取应用环境有啥区别?
Posted
技术标签:
【中文标题】使用 env(\'APP_ENV\')、config(\'app.env\') 或 App::environment() 获取应用环境有啥区别?【英文标题】:What is difference between use env('APP_ENV'), config('app.env') or App::environment() to get app environment?使用 env('APP_ENV')、config('app.env') 或 App::environment() 获取应用环境有什么区别? 【发布时间】:2017-02-22 22:12:42 【问题描述】:使用env('APP_ENV')
、config('app.env')
或App::environment()
获取应用环境有什么区别?
我知道env('APP_ENV')
将向$_ENV
、config('app.env')
读取配置,而App::environment()
是所有的抽象。在我看来,优势就是这个。 抽象。
我不知道是否还有其他差异,例如性能或安全级别
【问题讨论】:
没有真正的差异(因为值来自同一个地方:您的 .env 文件)但根据经验,您如果您希望缓存配置值,则应直接依赖config()
而不是 env()
。
【参考方案1】:
2020 年最新动态:
仅在配置文件中使用env()
使用App::environment()
检查环境(.env 中的APP_ENV)。
对所有其他环境变量使用config('app.var')
,例如:config('app.debug')
为您自己的 ENV 变量创建自己的配置文件。示例: 在你的 .env 中:
MY_VALUE=foo
示例config app/myconfig.php
return [
'myvalue' => env('MY_VALUE', 'bar'), // 'bar' is default if MY_VALUE is missing in .env
];
在您的代码中访问:
config('myconfig.myvalue') // will result in 'foo'
解释与历史:
我只是觉得。当您缓存配置文件时,env()
将(有时?)无法正常工作。所以我发现了:
-
Laravel 建议只在配置文件中使用
env()
。在您的代码中使用 config()
助手而不是 env()
。例如,您可以在代码中调用 config('app.env')
。
当您使用php artisan config:cache
时,所有配置字符串都会被框架缓存,并且您对.env
文件所做的任何更改都不会生效,直到您再次运行php artisan config:cache
命令。
来自 Laracast 上的this article:
更新:只要您不使用php artisan config:cache
,env()
调用就可以工作。所以这是非常危险的,因为它经常在开发时工作但在生产时会失败。见upgrade guide
缓存和环境
如果您在部署期间使用 config:cache 命令,则必须 确保您只从您的内部调用 env 函数 配置文件,而不是来自应用程序中的任何其他位置。
如果你是在你的应用程序中调用 env,它是强烈的 建议您在配置中添加适当的配置值 文件并从该位置调用 env ,允许您转换 你的环境调用配置调用。
更新 Laravel 5.6: Laravel 现在在其 documentation 中推荐使用
$environment = App::environment();
// or check on an array of environments:
if (App::environment(['local', 'staging']))
// The environment is either local OR staging...
而describes env()
只是从配置文件中的.env
检索值,例如config('app.env')
或config('app.debug')
。
【讨论】:
谢谢!它也在官方文档中被引用:laravel.com/docs/5.4/configuration#configuration-caching 这是 config('app.env') 不是 config('APP_ENV') 他们是否更改了文档?我没有发现他们在任何地方声明App::environment()
正在使用config('app.env')
。
.env 是您设置所有环境变量的地方,因此最终 App::environment() 将从 .env 文件中的 APP_ENV 获取它。 laravel.com/docs/5.6/configuration#environment-configuration
@JarsOfJam-Scheduler - 是的,在控制器等中,您仍然应该使用 config() 助手。【参考方案2】:
你有两个同样好的选择
if (\App::environment('production')) ...
或
if (app()->environment('production')) ...
app()->environment() 实际上被Bugsnag 使用,查看文档here 它说
默认情况下,我们会通过调用 Laravel 应用实例的 environment() 函数来自动检测应用环境。
现在,差异:
1) env(...)
函数在缓存配置后返回 null。它经常发生在生产中。
2) 您可以在单元测试中更改config
参数,它为您提供了测试时的灵活性。
【讨论】:
【参考方案3】:要考虑的一件事可能是将字符串传递给app()->environment()
以验证您当前的环境的便利因素。
// or App:: whichever you prefer.
if (app()->environment('local', 'staging'))
logger("We are not live yet!");
Seeder::seedThemAll();
else
logger("We are LIVE!");
【讨论】:
【参考方案4】:如果您在部署期间使用config:cache
命令,则必须确保您仅从配置文件中调用env
函数,而不是从应用程序的其他任何位置调用。
如果您从应用程序中调用 env,强烈建议您将正确的配置值添加到配置文件中,然后从该位置调用 env,这样您就可以将 env
调用转换为配置调用。
将 env 配置选项添加到您的 app.php
配置文件中,如下所示:
'env' => env('APP_ENV', 'production'),
更多:https://laravel.com/docs/5.2/upgrade#upgrade-5.2.0
【讨论】:
【参考方案5】:在12factor methodology应用程序中包含两种类型的配置值:
内部在部署之间没有变化,并存储在 laravel./config/
文件夹中。在这种类型中,我们通常存储应用程序中使用的一些技术最优/良好值,用户不应随着时间的推移而更改这些值,例如最佳图像压缩级别、连接超时、会话到期时间等。
external 因部署而异,并存储在.env
文件中(但不应存储在 git repo 中,但 .env.example
带有详细信息的示例值可以存储在 repo 中)。在这种类型中,我们通常存储一些重要/受保护的值,这些值取决于本地环境,例如密码、调试模式、数据库地址等。
Laravel 为此提出了方便的方法
在常规代码中,我们仅使用config(...)
帮助器(因此在此级别程序员不需要知道哪个配置值是内部的,哪个是外部的)
在配置代码中的外部配置值应该使用env(...)
helper 来设置,例如在 config/app.php 'debug' => env('APP_DEBUG', false)
【讨论】:
以上是关于使用 env('APP_ENV')、config('app.env') 或 App::environment() 获取应用环境有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章