使用 App::environment() vs app()->environment() vs config('app.env') 的区别

Difference between using App::environment() vs app()->environment() vs config('app.env')

使用 App::environment()app()->environment()config('app.env') 检查环境有什么区别?我假设前两个是完全相同的东西,但是那些与使用 config('app.env')?

相比呢?

我可以看到前两个 returns 整个服务容器实例,所以性能更差,但更安全还是什么?我读到人们建议只对您自己的配置变量和任何其他不是 env 的配置变量使用 config()。试图找出原因。

谢谢!

App::环境()
使用Facade获取环境,Illuminate\Foundation\Application.

的facade

app()
使用辅助函数 return \Illuminate\Container\Container::getInstance()environment() 在此 Container 实例的方法中。

解决()
app() 的别名,但需要一个参数,例如resolve('config')resolve(Application::class).

app()->make(Application::class)
使用容器来解析应用程序。这等于 app(Application::class).

Config::get('app.env')
使用 \Illuminate\Config\Repository.

的外观

配置('app.env')
使用辅助函数调用 app() 来解析配置。当您在位于 config/.

的配置文件中工作时,您应该 使用 env()

public 函数 __construct(配置 $config)
使用依赖注入来解析配置。

回答

引导应用程序时,the config variables are loaded在此应用程序中使用配置。

所以Container使用Config来加载变量。两者都是单例,所以调用它们并不会真正影响性能。

您选择哪种解决方案有时取决于 use-case,主要取决于偏好。

App::environment()app()->environment() 是一回事。 App 外观和 app() 辅助函数都只是访问应用程序容器的快捷方式。

在网络上下文中(从浏览器访问您的页面),App::environment() 方法和 config('app.env') 函数将 return 相同的值。

在 cli 上下文中(artisan 命令、排队作业等),App::environment() 方法和 config('app.env') 函数可以 return 不同的值。如果使用 --env 参数(例如:--env=testing)执行 运行 命令,则 App::environment() 方法将 return 实际检测到的环境(“测试"),而 config('app.env') 函数将继续 return 您的配置文件中定义的环境。

另外两件事需要考虑:

  1. environment() 方法是 public api 的一部分。这意味着唯一可能发生重大变化的是主要版本。 app.env 配置值不是 public api 的一部分。 Laravel 如果他们愿意,可以随时更改它,即使是在次要版本上。我怀疑他们会不会,但他们没有做出 public 承诺。

  2. environment() 方法采用可选参数来添加一点语法糖来测试您当前的环境。如果您传递参数,如果您处于任何提供的环境中,该方法将 return 一个布尔值,而不是 return 一个包含当前环境名称的字符串。参数也被视为正则表达式搜索:

    $isTesting = App::environment('test', 'testing', 'testarossa')
    // or
    $isTesting = App::environment('test*')
    

    (正则表达式前的“*”替换为“.*”)运行)