2012-11-30 13 views
12

私はスカラーとプレイフレームワークを初めて使いました。誰かが以下のスニペットを平易な英語に翻訳していただけますか?コンテキストのためにそのここで見つける:http://www.playframework.org/documentation/2.0.4/ScalaSecurity以下のスカラスニペットの英語の翻訳が必要

/** 
* This method shows how you could wrap the withAuth method to also fetch your user 
* You will need to implement UserDAO.findOneByUsername 
*/ 
def withUser(f: User => Request[AnyContent] => Result) = withAuth { username => implicit request => 
    UserDAO.findOneByUsername(username).map { user => 
    f(user)(request) 
    }.getOrElse(onUnauthorized(request)) 
} 
+5

質問を閉じるために投票が得られない理由は分かりません。私はあなたの質問が完全に合法だと思う。私は以前にそのコードを見て、それがどう働いているのだろうと思っていました。 – huynhjl

答えて

21

パート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となります。これは、RequestResult(上記のパート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)) 
+0

非常に詳細な答えをありがとう。あなたは上を行きました! – critium

関連する問題