48

env('APP_ENV')use或to get app environment 有config('app.env')什么区别?App::environment()

我知道env('APP_ENV')will to $_ENVconfig('app.env')读取配置并且App::environment()是所有的抽象。在我看来,优势就是这个。抽象

我不知道是否还有其他差异,例如性能或安全级别

4

5 回答 5

80

在简短和最新的 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()(有时?)将无法正常工作。所以我发现:

  1. Laravel 建议只env()在配置文件中使用。在您的代码中使用config()帮助程序而不是env(). 例如,您可以调用config('app.env')您的代码。
  2. 当您使用php artisan config:cache所有配置字符串时,框架会缓存所有配置字符串,并且您对.env文件所做的任何更改都不会生效,直到您php artisan config:cache再次运行该命令。

这篇关于 Laracast 的文章:

更新:
env()只要您不使用php artisan config:cache. 所以这是非常危险的,因为它通常会在开发时工作,但在生产时会失败。请参阅升级指南

缓存和环境

如果在部署期间使用 config:cache 命令,则必须确保仅从配置文件中调用 env 函数,而不是从应用程序中的任何其他位置调用。

如果您从应用程序中调用 env,强烈建议您将正确的配置值添加到配置文件并从该位置调用 env,从而允许您将 env 调用转换为配置调用。

更新 Laravel 5.6:
Laravel 现在在其文档中推荐使用

$environment = App::environment();

// or check on an array of environments:
if (App::environment(['local', 'staging'])) {
    // The environment is either local OR staging...
}

描述env()只是从.env配置文件中检索值,例如config('app.env')or config('app.debug')

于 2017-02-22T13:48:15.063 回答
10

你有两个同样好的选择

if (\App::environment('production')) {...}

或者

if (app()->environment('production')) {...}

app()->environment() 实际上由Bugsnag使用,查看文档here它说

默认情况下,我们会通过调用 Laravel 应用实例上的 environment() 函数来自动检测应用环境。

现在,差异:

1)env(...)函数在缓存配置后返回 null。它经常发生在生产中。

2)您可以在单元测试中更改config参数,它为您提供了测试时的灵活性。

于 2017-02-03T03:45:59.830 回答
4

要考虑的一件事可能是传递字符串以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!");
}
于 2016-10-14T08:43:40.863 回答
2

如果您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

于 2018-04-12T08:12:21.467 回答
0

12factor 方法应用程序中包含两种类型的配置值:

  • internal 在部署之间没有变化,并存储在 laravel./config/文件夹中。在这种类型中,我们通常存储应用程序中使用的一些技术最佳/良好值,用户不应随时间更改这些值,例如最佳图像压缩级别、连接超时、会话到期时间等。
  • external 因部署而异并存储在.env文件中(但不应存储在 git repo 中,但是.env.example带有详细信息的示例值可以存储在 repo 中)。在这种类型中,我们通常存储一些重要/受保护的值,这些值取决于本地环境,例如密码、调试模式、数据库地址等。

Laravel 为此提出了方便的方法

  • 在常规代码中我们只使用config(...)助手(所以在这个级别程序员不需要知道哪个配置值是内部的,哪个是外部的)
  • 在配置代码中,外部配置值应该使用env(...)助手设置,例如在 config/app.php'debug' => env('APP_DEBUG', false)
于 2019-07-16T20:51:49.867 回答