我现在尝试了很长时间来围绕如何在消化函子表单字段中使用验证,这需要访问另一个 monad。简而言之,我有这样的消化形式
studentRegistrationForm :: Monad m => Form Text m StudentRegistrationData
studentRegistrationForm = StudentRegistrationData
<$> "school" .: choice schools Nothing
<*> "studentId" .: check studentIdErrMsg (not . T.null) (text Nothing)
<*> "firstName" .: check firstNameErrMsg (not . T.null) (text Nothing)
<*> "lastName" .: check lastNameErrMsg (not . T.null) (text Nothing)
<*> "email" .: check emailErrMsg (E.isValid . T.unpack) (text Nothing)
(studentId 基本上就是用户名)
并想使用Snap.Snaplet.AuthusernameExists
的功能来检查输入的用户名是否唯一。
为了完整起见,这里是对应的数据类型:
data StudentRegistrationData = StudentRegistrationData
{ school :: School -- ^ school the student is enroled
, studentId :: Text -- ^ matriculation number of the student
, firstName :: Text -- ^ first name of the student
, lastName :: Text -- ^ last name of the student
, email :: Text -- ^ email for sending password
} deriving (Show)
我在处理程序中创建我的表单,例如:
studentRegistrationHandler :: AppHandler ()
studentRegistrationHandler = do
(view, registrationData) <- runForm "form" SRF.studentRegistrationForm
maybe (showForm "registration" view) createUser registrationData
showForm :: String -> View Text -> AppHandler ()
showForm name view =
heistLocal (bindDigestiveSplices view) $ render template
where
template = BS.pack $ "student-" ++ name ++ "-form"
所以我现在的问题是了解如何访问表单内的 Auth snaplet 的状态。是已经通过还是我必须自己通过?Text.Digestive.Form中的函数会checkM
分别帮助我吗?validateM
我发现了几个如何使用消化函子和 snap auth 和 session 的例子,比如:
但是没有一个显示 Snap.Snaplet.Auth 和消化仿函数直接一起工作,而且在 monad 转换器和提升方面我仍然是一个菜鸟……也许这对我来说太容易看到了。:(
我可以在 github 上上传一个独立的示例,如果它有助于说明它,它会显示我的问题。非常欢迎任何提示、指示和建议!:)
汉内斯
补充:我创建了一个演示基本身份验证功能的示例应用程序,你可以看看这里:消化功能器-快照-验证-示例享受!