【问题标题】:Trying to understand how you use the request in Actions试图了解您如何在 Actions 中使用请求
【发布时间】:2015-12-22 21:12:21
【问题描述】:

我想了解当你这样做时请求变量是如何进入范围的:

def test(): Action = {  request =>

}

参考: https://github.com/playframework/playframework/blob/master/framework/src/play/src/main/scala/play/api/mvc/Action.scala

能否在范围内引入其他变量? 这在 Scala 中是如何工作的?

在关系问题中,我创建了自己的自定义操作,但我对它到底是什么类型感到困惑?

我做了类似身份验证示例的操作:

class AuthenticatedRequest[A](val username: String, request: Request[A]) extends WrappedRequest[A](request)

object Authenticated extends ActionBuilder[AuthenticatedRequest] {
  def invokeBlock[A](request: Request[A], block: (AuthenticatedRequest[A]) => Future[SimpleResult]) = {
    request.session.get("username").map { username =>
      block(new AuthenticatedRequest(username, request))
    } getOrElse {
      Future.successful(Forbidden)
    }
  }
}

参考:https://www.playframework.com/documentation/2.2.x/ScalaActionsComposition

在我的控制器中,我想将“请求”作为参数传递给方法,但我无法弄清楚它的确切类型。当我尝试 AuthenticatedRequest 时,它说我必须传入类型参数。

【问题讨论】:

  • @I.K.我看还行。但它是如何做到的呢?有人可以创建一个简单的类,它的行为类似于一个动作,但为了让我明白这一点而进行了精简?
  • 不知道你为什么对Action感到困惑;它只是一种表示将Request 映射到Result 的函数的类型。来自源代码:def apply(request: Request[A]): Future[Result]

标签: scala playframework


【解决方案1】:

Action 是一个以 Request[A] 对象作为参数并返回 Result 的函数,这就是您的测试方法的类型。考虑一个简单的例子

type StrLen = String => Int

/**
 * A function that returns another function from String to Int
 */
def test2(): StrLen = { someString => someString.length() }

def test2(): StrLen = str: String => { /* body */
   str.length()
}

【讨论】:

  • 在您的第一个示例中, someString 来自哪里?那是我不明白的。您没有将 someString 作为参数传递
  • 跟随类型问自己,如何定义函数字面量
  • 哦,我明白了。嗯,好的,现在开始下沉了。
猜你喜欢
  • 2016-06-01
  • 2018-02-22
  • 1970-01-01
  • 2014-08-23
  • 1970-01-01
  • 2017-06-21
  • 2021-12-25
  • 2017-09-16
  • 2017-04-23
相关资源
最近更新 更多