在 Play 2.1 应用程序中,我将如何以编程方式确定应用程序在哪种模式下运行(即Development与Production)?
例如,能够从模板内部执行以下操作会很有用:
<p>@if(__some_play_API_call__ == Dev) { <b>Development mode</b> }</p>
在 Play 2.0 API 文档中,似乎有一个类mode
的属性......但是,我不确定如何获取当前正在运行的应用程序的实例。play.api.Application
在 Play 2.1 应用程序中,我将如何以编程方式确定应用程序在哪种模式下运行(即Development与Production)?
例如,能够从模板内部执行以下操作会很有用:
<p>@if(__some_play_API_call__ == Dev) { <b>Development mode</b> }</p>
在 Play 2.0 API 文档中,似乎有一个类mode
的属性......但是,我不确定如何获取当前正在运行的应用程序的实例。play.api.Application
您可以通过以下方式访问当前应用程序
play.api.Play.current()
找出模式尝试
play.api.Play.current().mode()
或简单地使用
play.api.Play.isDev(play.api.Play.current())
在 Play 2.5.x 中,该play.Play.isDev()
方法已被弃用,必须使用依赖注入:
import javax.inject.Inject;
public class Example {
@Inject
private play.Environment environment;
public void myMethod() {
if (environment.isDev()) {
...
}
}
}
或者等效地在 Scala 中:
class ErrorHandler @Inject()(environment: Environment) {
def myMethod() = {
if (environment.isDev) {
...
}
}
}
environment.isDev()
返回一个布尔值,可以轻松地将其传递给模板。无需使用此处描述的隐式变量。
使用Play 2.5、Play 2.6和 Play 2.7
你可以这样做:
import play.Environment
class MyController @Inject()(env: Environment) {
println(s"DevMode is ${env.isDev}")
println(s"ProdMode is ${env.isProd}")
println(s"TestMode is ${env.isTest}")
}
或者在Play 2.6和 Play 2.7中,您还有以下版本play.api.Environment
:
import play.api.Environment
class MyController @Inject()(env: Environment) {
println(s"ProdMode is ${env.mode == Mode.Prod}")
println(s"DevMode is ${env.mode == Mode.Dev}")
println(s"TestMode is ${env.mode == Mode.Test}")
}
对于两个 Scala Doc 状态:
/**
* The environment for the application.
*
* Captures concerns relating to the classloader and the filesystem for the application.
*/
在 play 2.3.X 中,您还可以通过以下方式检查:
play.Play.isProd()
play.Play.isDev()
play.Play.isTest()
在使用 Scala 的 Play 2.5 中,有一个context.environment.mode
值为Enumeration
fromplay.api.Mode
和其中一个值Dev, Test, Prod
。
对于编译时依赖注入,您context
可以在应用程序加载器中使用,如果您扩展,BuiltInComponentsFromContext
则可以直接使用 (inject)environment.mode
在Play 2.6中,注入一个Environment
实例并使用它的mode
字段:play.api.Mode
枚举值之一。
import javax.inject.Inject
import play.api.Environment
import play.api.Mode.Prod
import play.api.mvc.{AbstractController, ControllerComponents}
class TestController @Inject()(cc: ControllerComponents, env: Environment)
extends AbstractController(cc) {
def hello = Action {
if (env.mode == Prod) {
// ...
}
Ok(s"Hello world in ${env.mode} mode")
}
}
至少在 Play 2.6.20中, pme 提到env.isDev
的方法,env.isProd
等不再起作用。