パート1:最初のは、カリー化構文に対処してみましょう:
withUser
はタイプUser => Request[AnyContent] => Result
のカリー化機能f
を取る方法です。 User
オブジェクトを受け取り、Request
をとり、Result
を返す別の関数を返します。 f
がその関数であれば、それを破壊し、:
val g = f(user) // g is a function
val result = g(request) // returns a result
// same as:
val result = f(user)(request)
事実上f
はちょうど2つのパラメータを取りますが、代わりにf(a, b)
を呼び出すあなたはf(a)(b)
を呼び出す関数のようです。
withAuth
もカルト機能を持つメソッドです。それはwithUser
とほとんど同じタイプです。
パート2:今、どのようにこれらのメソッドを使用してください:
としてはhereを説明し、プレイはあなたがResult
オブジェクトにRequest
オブジェクトを変換するためにどのようにそれを伝えることで、あなたのアプリケーションロジックを定義します。
withAuth
は、あなたの認証を担当し、便利にユーザー名を取得するヘルパー機能です。だから、このようにそれを使用します。
def index = withAuth { username => implicit request =>
Ok(html.index(username))
}
それはRequest
を取り、ニーズを再生するものである、Result
を返す関数を返します。しかし、それが必要なのは、カレイド関数(ユーザーネームを取る)と関数(要求を受け取る)を返すことです。要求パラメーターは暗黙的にとマークされているため、暗黙の要求パラメーターを必要とする関数/メソッド呼び出しに暗黙的に渡すことができます。この説明の目的で、implicit
というキーワードを無視してください。
パート3:withUser
の翻訳まあ、その署名はwithAuth
に似ており、それが最初のパラメータを除いて同じように使用されるために目標があるUser
の代わりString
になります。したがって、それはUser => Request => Result
を取らなければならない。要求特性は、そのコンテンツのタイプを示すタイプパラメータをとる。ここはAnyContent
です。したがって、引数の正しい型はwithUser
です。User => Request[AnyContent] => Result
です。それはあなたがこのようにそれを使用することができますを意味します
withUser { user => implicit request =>
// do something with user and request to return a result
}
あなたがwithUser
の定義を見れば、それがないすべてがwithAuth
を呼び出すことです:
def withUser(f: User => Request[AnyContent] => Result) = withAuth {
// ...
}
だから、同じ型を返します。 withAuth
となります。これは、Request
をResult
(上記のパート2を参照)に変換する関数を返します。意味し、我々はこのようにそれを使用することができるようになります。withAuth
の引数として渡された何
def index = withUser { user => implicit request =>
Ok(html.index(user))
}
はカリー化関数です。
username => // first param is the username as a String
implicit request => // second param is the request
// here we have to return a Result...
// we lookup the user - we may not have one:
val userOption: Option[User] = UserDAO.findOneByUsername(username)
// f is the code block that will be provided inside withUser { f }
// Part 1 explains the f(user)(request) syntax
// We call f to get a result, in the context of the Option monad
val resultOption: Option[Result] = userOption.map(user => f(user)(request))
// if we have a result, return it; otherwise return an error.
resultOption.getOrElse(onUnauthorized(request))
質問を閉じるために投票が得られない理由は分かりません。私はあなたの質問が完全に合法だと思う。私は以前にそのコードを見て、それがどう働いているのだろうと思っていました。 – huynhjl