Naprawdę staram się zrozumieć asynchroniczne moce Play, ale znajduję wiele konfliktów w odniesieniu do miejsc, w których spotyka się asynchroniczne wywoływanie, oraz miejsc, w których struktura zdaje się spiskować przeciwko jego użyciu.Czy mogę przeprowadzić walidację formularza asynchronicznego w Play Framework 2.x (Scala)?
Podany przykład dotyczy sprawdzania poprawności formularza. Gra pozwala zdefiniować ograniczenia ad-hoc - zobacz to z dokumentacji:
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. Jednakże, jeśli używam warstwy asynchronicznej dostępu do danych (np. ReactiveMongo), takie wywołanie do User.authenticate(...)
zwróci Future
i jestem w ten sposób w ciemności, w jaki sposób mogę wykorzystać moc obu wbudowanych wiążących formularzy funkcje i narzędzia asynchroniczne.
Dobrze i dobrze jest upublicznić podejście asynchroniczne, ale denerwuję się, że niektóre części schematu nie są z nim tak dobrze odtwarzane. Jeśli sprawdzanie poprawności musi być wykonywane synchronicznie, wydaje się, że pokonuje punkt podejścia asynchronicznego. Podobny problem wystąpił podczas korzystania z kompozycji Action
- np. zabezpieczenie związane z numerem Action
, które wywołałoby wywołanie ReactiveMongo.
Czy ktoś może rzucić światło na to, gdzie moje pojmowanie jest niewystarczające?
Jak mogę ustawić komunikat o poprawności dynamicznie? Wiadomość może być na przykład "Nieprawidłowa nazwa użytkownika lub hasło" lub "Usługa niedostępna teraz". Drugie pytanie brzmi: czy mogę uzyskać obiekt użytkownika w działaniu bez duplikowania żądania autoryzacji? – Artem