2012-08-24 3 views
1

Je voudrais faire une coutume play.api.mvc.Action en jeu que:Comment créer des actions personnalisées en jeu! 2.0 Cadre?

  1. va analyser et retourner des données personnalisées dans la demande (comme les jetons d'accès, ou des tampons de protocole)
  2. peuvent être enchaînées avec d'autres actions

Exemple:

def something = DecodeAccessToken { token: AccessToken => 
    Action { 
    // do something with token 
    Ok 
    } 
} 

Si le jeton est pas présent, le shou d'action DecodeAccessToken ld retourner tôt avec Unauthorized ou BadRequest.

Répondre

0

Vous pouvez utiliser le modèle de base comme suit:

trait DecodeAccessToken[A] extends Action[A] 
object DecodeAccessToken { 
    def apply[A](bodyParser: BodyParser[A])(block: AccessToken=>Request[A] => Result) = new DecodeAccessToken[A] { 
    def parser = bodyParser 
    def apply(req: Request[A]) = { 
     val token: AccessToken = //deserialize token from request 

     // If there is a problem with the token, do not call `block` below 
     // Instead just return Results.BadRequest 

     block(token)(req) 
    } 
    } 
    def apply(block: AccessToken => Request[AnyContent] => Result): Action[AnyContent] = { 
    DecodeAccessToken(BodyParsers.parse.anyContent)(block) 
    } 
} 
1

Ce n'est pas approach recommended in the Play! documentation, mais j'écrirait cela comme:

def DecodeAccessToken(body: AccessToken => Result)(implicit request: Request[_]): Result = { 
    val token: AccessToken = // deserialize token from request 
    body(token) 
} 

def something = Action { implicit request => 
    DecodeAccessToken { token: AccessToken => 
    Ok 
    } 
}