使用 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') 将向$_ENVconfig('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:cacheenv() 调用就可以工作。所以这是非常危险的,因为它经常在开发时工作但在生产时会失败。见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() 获取应用环境有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

laravel 8 修改APP_ENV为sim,路由访问就变成404了?

Laravel .env 多环境配置文件的使用

如何从 .env 文件中获取键的值?

Laravel - 访问 .env 变量

laravel5环境配置

laravel could not parse uri