laravel 使用env('APP_ENV')、config('app. env')或App::environment()获取应用程序环境有什么区别?

s71maibg  于 2023-01-10  发布在  其他
关注(0)|答案(6)|浏览(441)

使用env('APP_ENV')config('app.env')App::environment()获取应用程序环境有何区别?
我知道env('APP_ENV')会到$_ENVconfig('app.env')读取配置,而App::environment()是所有配置的抽象。在我看来,优势甚至在于此。抽象
我不知道是否有其他不同之处,例如性能或安全程度

kh212irz

kh212irz1#

    • 2022年最新简报:**
  • 仅在配置文件中使用env()
  • 使用App::environment()检查环境(. env中的APP_ENV)。
  • 对所有其他env变量使用config('app.var'),例如:config('app.debug')
  • 为自己的ENV变量创建自己的配置文件。例如:

在您的. env中:
MY_VALUE=foo
示例config/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')
    1.当您使用php artisan config:cache时,框架会缓存所有配置字符串,并且您对.env文件所做的任何更改都不会生效,直到您再次运行php artisan config:cache命令。
    来自Laracast上的this article
    更新:
    只要不使用php artisan config:cacheenv()调用就可以工作。因此,这非常危险,因为它通常在开发时工作**,但在生产时会失败**。请参阅升级指南
    • 缓存和环境**

如果在部署期间使用config:cache命令,则必须确保仅从配置文件中调用env函数,而不是从应用程序中的任何其他位置调用。
如果要从应用程序内部调用env,强烈建议您向配置文件中添加适当的配置值,并从该位置调用env,从而将env调用转换为config调用。
更新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')config('app.debug')

px9o7tmv

px9o7tmv2#

你有两个同样好的选择

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

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

app()-〉environment()实际上由Bugsnag使用,请查看here文档
默认情况下,我们将通过调用Laravel应用程序示例上的environment()函数来自动检测应用程序环境。
现在,差异:
1)env(...)函数在缓存配置后返回空值。在生产中经常发生这种情况。
2)你可以在单元测试中改变config参数,这给了你测试的灵活性。

r55awzrz

r55awzrz3#

要考虑的一件事可能是将string传递给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!");
}
trnvg8h3

trnvg8h34#

如果在部署期间使用config:cache命令,则必须确保仅从配置文件中调用env函数,而不是从应用程序中的任何其他位置调用。
如果您正在从应用程序内部调用env,强烈建议您将正确的配置值添加到配置文件中,并从该位置调用env,从而允许您将env调用转换为config调用。
将env配置选项添加到app.php配置文件中,如下所示:

'env' => env('APP_ENV', 'production'),

更多信息:https://laravel.com/docs/5.2/upgrade#upgrade-5.2.0

xxslljrj

xxslljrj5#

2023年更新答案

bootstrap/cache目录中没有config.php时,env()帮助器工作
config()助手在config.php文件存在或不存在的情况下都起作用。如果文件不存在,则if将在运行时解析变量,但如果确实找到了一个;它使用高速缓存的版本。
在生产环境中,我们运行artisan命令来添加/删除配置文件. php,这对于env()config()的行为至关重要。
请考虑以下示例以理解此概念:

Route::get('/', function () {
  // to experiment: set APP_ENV=production in your .env file
  echo 'Via env(): ' . env('APP_ENV') . '<br/>'; // production
  echo 'Via config(): ' . config('app.env'); // production

  /*
  |--------------------------------------------------------------------------
  | run: php artisan config:cache
  |--------------------------------------------------------------------------
  |
  | The config:cache command will generate a configuration cache file (config.php) in the bootstrap/cache directory.
  | At this point, the env() helper will no longer work as all ENV variables will be flushed in favor of the cached config.php file.
  |
  */

  echo '<hr/>';

  echo 'Via env(): ' . env('APP_ENV') . '<br/>'; // null
  echo 'Via config(): ' . config('app.env'); // production

  /*
  |--------------------------------------------------------------------------
  | run: php artisan config:clear
  |--------------------------------------------------------------------------
  |
  | The config:clear command will remove (config.php) configuration cache file from the bootstrap/cache directory.
  | At this point, the env() helper will work again as framework doesn't find a cached configuration file.
  |
  */
  echo '<hr/>';

  echo 'Via env(): ' . env('APP_ENV') . '<br/>'; // production
  echo 'Via config(): ' . config('app.env'); // production
});

因此,一般的经验法则是始终在代码文件中使用config()帮助器;这样,无论缓存配置文件是否可用,代码都不会爆炸。
现在得到environment是如此重要和普遍; Laravel为我们提供了几种方法来实现同样的目标:

// APP_ENV=production inside .env file

App::environment(); // production
app()->environment(); // production

App::environment('production'); // returns boolean: true
app()->environment('production'); // return boolean: true

请记住,您使用的是App facade或app() helper,它们都将使用config helper。

luaexgnf

luaexgnf6#

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

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

Laravel为此提出了简便的方法

  • 在常规代码中,我们只使用config(...) helper(因此在此级别上,程序员不需要知道哪些配置值是内部,哪些是外部)
  • 在配置代码中,外部配置值应该使用env(...)助手设置,例如在config/app.php 'debug' => env('APP_DEBUG', false)

相关问题