I'm making a real push to understand the async powers of Play but finding a lot of conflict with regard to places where async invocation fits and places where the framework seems to conspire against its use.
The example I have relates to form validation. Play allows for ad-hoc constraints to be defined - see this from the docs:
val loginForm = Form(
tuple(
"email" -> email,
"password" -> text
) verifying("Invalid user name or password", fields => fields match {
case (e, p) => User.authenticate(e,p).isDefined
})
)
Nice and clean. However, if I'm using a fully async data access layer (e.g. ReactiveMongo), such a call to User.authenticate(...)
would return a Future
and I'm thus in the dark as to how I can utilise the power of both the built in form binding features and the async tools.
It's all well and good to publicise the async approach but I'm getting frustrated that certain parts of the framework don't play so well with it. If the validation has to be done synchronously, it seems to defeat the point of the async approach. I've come across a similar problem when using Action
composition - e.g. a security related Action
that would make a call to ReactiveMongo.
Can anyone shed any light on where my comprehension is falling short?