2012-06-25 14 views
9

Ho un Play 2.0 appScala Play 2, passando richiesta al metodo

TestController.scala

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

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

C'è un modo per utilizzare implicit per passare request a bar

risposta

16

Sì, è possibile:

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

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

Il codice:

Action { implicit request 

chiama questo metodo per l'oggetto Azione:

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

Allora, che hai chiamato "richiesta" corrisponde al paramater denominato "blocco". Il "implicito" qui è facoltativo: rende disponibile il valore "richiesta" come parametro implicito ad altre chiamate metodo/funzione.

L'implicito nella funzione "barra" indica che può assumere il valore di "req" da un valore implicito e non necessariamente deve essere passato in modo esplicito.

+0

Grazie Adam, funziona. Domanda di follow-up, l'implicito bisogno di essere passato come un parametro al curry? – Bob

+1

In scala, è il parametro _list_, non il parametro, che è implicito. Non sono sicuro della motivazione per questo. –

+1

scala> val implicito i = 1 i: int = 1 scala> val implicito s = "hi" s: java.lang.String = hi scala> def concat (x impliciti: Int, y: String) = x + y concat: (implicito x: Int, implicito y: String) Stringa scala> concat res0: String = 1hi –