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

Mig*_*ges 13 environment-variables laravel laravel-5 phpdotenv

是用什么区别env('APP_ENV'),config('app.env')或者App::environment()导致某些应用环境?

我知道env('APP_ENV')意志$_ENV,config('app.env')读取配置,App::environment()是所有的抽象.在我看来,优势甚至是这个.抽象.

我不知道是否存在其他差异,例如性能水平或安全性

ndb*_*erg 23

我只是觉得它.当您缓存配置文件时,env()将(有时?)无法正常工作.所以我发现了:

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

从这里:https: //laracasts.com/discuss/channels/general-discussion/env-not-reading-variables-sometimes

更新:
env()调用工作,只要你不使用php artisan config:cache.因此它非常危险,因为它通常会在开发时起作用,但在生产时会失败.请参阅升级指南:https://laravel.com/docs/5.2/upgrade#upgrade-5.2.0

更新Laravel 5.6:
Laravel现在建议在其文档中使用

MY_VALUE=foo
Run Code Online (Sandbox Code Playgroud)

描述了env()只是从配置文件中的.env中检索值.但这仅适用于config('app.env'),不适用于其他变量,如config('app.debug').


Yev*_*yev 10

你有两个同样好的选择

if (\App::environment('production')) {...}
Run Code Online (Sandbox Code Playgroud)

或者

if (app()->environment('production')) {...}
Run Code Online (Sandbox Code Playgroud)

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

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

现在,差异:

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

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


Jof*_*yHS 5

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!");
}
Run Code Online (Sandbox Code Playgroud)