2012-06-25 6 views
9

Ich habe eine Play 2.0 AppScala Play 2, Anfrage-Methode übergeben

TestController.scala

def foo(p1: String) = Action {implicit request => 
    Ok(bar(p1)) 
} 

private def bar(p1: String) = { 
//access request parameter here 
} 

Gibt es eine Möglichkeit implicit zu verwenden request zu bar

Antwort

16

Ja zu passieren, können Sie:

def foo(p1: String) = Action { implicit request => 
    Ok(bar(p1)) 
    } 

    private def bar(p1: String)(implicit req: RequestHeader) = "content" 

Der Code:

Action { implicit request 

ruft diese Methode auf dem Aktionsobjekt:

def apply(block: Request[AnyContent] => Result): Action[AnyContent] = { 

Also, was Sie "Anfrage" genannt stimmt mit dem Namen Paramater "Block". Das "implizite" ist hier optional: Es stellt den Wert "request" als impliziten Parameter für andere Methoden-/Funktionsaufrufe zur Verfügung.

Das implizite in Ihrer "bar" -Funktion besagt, dass es den Wert von "req" von einem impliziten Wert nehmen kann und nicht unbedingt explizit übergeben werden muss.

+0

Danke Adam, das funktioniert. Follow-up-Frage, muss das Implizite als Curry-Parameter übergeben werden? – Bob

+1

In Scala ist es der Parameter _list_, nicht der Parameter, der implizit ist. Ich bin mir der Motivation dafür nicht sicher. –

+1

scala> val implizite i = 1 i: Int = 1 Scala> val implizite s = "Hallo" s: java.lang.String = Hallo scala> def concat (implizit x: Int, y: String) = x + y concat: (implizit x: Int, impliziter y: String) String scala> concat res0: String = 1hi –