【问题标题】:Play 2.x Scala Controller clarification neededPlay 2.x Scala Controller 需要说明
【发布时间】:2013-09-19 18:15:53
【问题描述】:

我一直在学习和玩 Scala,同时我一直在努力学习 Play!尤其是 Scala 版本的播放。

我了解对象的应用方法,甚至了解将代码块传递给 Trait 或 Class。但在所有示例中,动作代码块示例类似于:

def index = Action {
Ok("Got request [" + request + "]")
}

所以在这里我们使用了 Action-companion 对象助手,并且我们正在将代码块传递给这个伴随对象 apply-function ?

但我不明白“请求”从哪里填充?这是我在 Scala 中遇到的问题,一些“神秘”的魔法刚刚发生,但我需要理解它。 :)

如果有人可以向 Scala 和 Play 解释这一点!新手您的帮助将不胜感激。

【问题讨论】:

    标签: scala playframework controller playframework-2.0


    【解决方案1】:

    实际上并没有那么神奇(至少在这种情况下)。控制器接收请求并产生响应。在 Play 中,如果您不需要访问或使用任何请求信息,您可以这样写:

    def index = Action {
       Ok("hello, world")  // Not using the request!
    }
    

    但是您编写的代码(截至目前)实际上不会编译,因为正如您所说,没有给出请求。相反,您需要这样做:

    def index = Action { request =>
      Ok("Got request [" + request + "]")
    }
    

    即请求是返回ResultOk)的函数的参数。

    是的,你是对的,它相当于写作:

    def index = Action.apply({ request =>
      Ok("Got request [" + request + "]")
    })
    

    甚至更明确:

    def myAction[T]: (Request[T] => Result) = request => Ok("Got request [" + request + "]")
    
    def index = Action.apply(myAction)
    

    index不是直接返回响应的函数。它是框架调用以获取请求处理程序的函数(Action)。然后可以使用传入请求调用该处理程序以产生响应。


    还有其他变体。默认情况下,请求的内容(即正文)作为通用AnyContent 处理。如果您想以某种特定方式显式解析正文,例如 JSON,您可以传递 BodyParser 作为第一个(咖喱)参数:

    def index = Action(myBodyParser) { request =>
      Ok("Got request [" + request + "]")
    }
    

    注意:将请求设为隐式参数是很常见的,例如,它会自动传递给模板:

    def index = Action { implicit request =>
      Ok(views.html.mypage())
    }
    

    对于一些模板代码,例如:

    @()(implicit request: RequestHeader)
    
    <h1>I was called at @request.path</h1>
    

    【讨论】:

    • 感谢您的回答。我在代码中犯了一个错误,我的意思就像你的例子。但我想知道的是请求是否来自代码块?如果我说 def index() 返回 Result,那么 Result 是 Action 块的结果。但是 index() 方法从不接收请求(至少作为参数)。那么请求是否填充在对象的某处?我知道这是个愚蠢的问题,但是对于 Java 背景,奇怪的是我有参数但它没有定义它来自哪里?我没有看到对象在任何地方接收到值?
    • 我已尝试回答您的问题,但绝对值得对 FP 和 Scala(语法和哲学)进行一些额外的阅读。 TL;DR,index 是一个返回另一个函数的函数。那里没有魔法。
    • 好的,谢谢。我的问题更多关于 Scala。我知道 Action 是一个特征,它具有创建 Actions 的伴随对象。但是您将代码块传递给创建 Result 对象的伴随对象。但是,如果我没有在控制器中的任何地方定义“请求”,它从何而来?是否来自超类/特质?
    • 我知道这更多的是关于语法。但我很难把头绕在我没有在任何地方定义的“变量/对象”上。我知道 Scala 的基本语法和功能特性,但是当我看到不仅仅是简单示例的代码时,我很难理解语法。
    • 我也有点困惑,我在这里传递了一个代码块吗?不是像集合这样的函数文字吗?很抱歉重复我自己,但如果我有代码块,我可以引用范围内的对象,那么“请求”引用来自哪里?来自 Action 伴生对象还是来自 Controller 超类/特征?我不记得是哪一个了。 :) 我试图从 Java 版本的 play 中查找它,并且 Response 是静态方法,所以我怀疑它是否填充在 Controller 中?或者我只是超出了我的理解,你不能教老狗新把戏;)
    猜你喜欢
    • 2012-11-22
    • 2014-10-08
    • 1970-01-01
    • 1970-01-01
    • 2012-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多