我浏览了 yesod 的书和源代码,并了解了一切是如何运作的。但在我写自己的东西之前,在脚手架站点中有一件事我只是不明白。
所以我搭建了一个站点“copywww”,在文件 CopyWWWState.hs 中有代码:
instance YesodPersist CopyWWWState where
type YesodDB CopyWWWState = SqlPersist
runDB db = liftIOHandler
$ fmap connPool getYesod >>= Settings.runConnectionPool db
instance YesodAuth CopyWWWState where
type AuthId CopyWWWState = UserId
-- Where to send a user after successful login
loginDest _ = RootR
-- Where to send a user after logout
logoutDest _ = RootR
getAuthId creds = runDB $ do
x <- getBy $ UniqueUser $ credsIdent creds
case x of
Just (uid, _) -> return $ Just uid
Nothing -> do
fmap Just $ insert $ User (credsIdent creds) Nothing
authPlugins = [ authOpenId
, authEmail
]
我不明白的行是:
type AuthId CopyWWWState = UserId
type YesodDB CopyWWWState = SqlPersist
当我删除它们时,显然会出现错误,但我不确定为什么首先需要它们。当我搜索“UserId”或“SqlPersist”的来源时,我没有找到任何看起来有希望的东西。这段代码到底需要做什么?yesod 在这些类中使用类型族有什么好处?