Czy mogę wykonać walidację formularza asynchronicznego w Play Framework 2.x (Scala)?
Naprawdę staram się zrozumieć asynchroniczne moce Play, ale znajduję wiele konfliktów w odniesieniu do miejsc, w których asynchroniczne wywołanie pasuje i miejsc, w których struktura wydaje się spiskować przeciwko jej użyciu.
Przykład, który mam, dotyczy walidacji formularza. Odtwarzanie umożliwia zdefiniowanie ograniczeń ad-hoc - patrz dokumentacja:
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
})
)
Ładne i czyste. Jeśli jednak używam w pełni asynchronicznej warstwy dostępu do danych (np. ReactiveMongo), takie połączenie doUser.authenticate(...)
zwróciFuture
i dlatego jestem w ciemności co do tego, jak mogę wykorzystać moc zarówno wbudowanych funkcji wiązania formularzy, jak i narzędzi asynchronicznych.
Dobrze jest nagłośnić podejście asyncowe, ale denerwuję się, że niektóre części frameworka nie grają z nim tak dobrze. Jeśli walidacja musi być przeprowadzona synchronicznie, wydaje się, że pokonuje ona punkt podejścia asynchronicznego. Znalazłem podobny problem podczas używaniaAction
skład - np. związane z bezpieczeństwemAction
który zadzwoniłby do ReactiveMongo.
Czy ktoś może rzucić jakieś światło na to, gdzie moje zrozumienie jest krótkie?