我浏览了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
]
Run Code Online (Sandbox Code Playgroud)
我不理解的那些是:
type AuthId CopyWWWState = UserId
type YesodDB CopyWWWState = SqlPersist
Run Code Online (Sandbox Code Playgroud)
当我删除它们时,我显然会出现错误,但我不确定为什么它们首先是必需的.当我在源代码中搜索"UserId"或"SqlPersist"时,我想出了一些看起来很有希望的东西.这段代码究竟需要什么?yesod在这些类中使用类型系列有什么好处?
脚手架中有相当多的东西可能不会立即显现出来.在config/model中,有一个持久化实体定义如下:
User
name String
foo String
Run Code Online (Sandbox Code Playgroud)
这将创建一个类型User,它是PersistEntity的一个实例,UserId类型是这样使用的:
instance PersistEntity User where
...
Key User = UserId
Run Code Online (Sandbox Code Playgroud)
脚手架放入的原因:
type AuthId CopyWWWState = UserId
Run Code Online (Sandbox Code Playgroud)
只是用户是一个逻辑参考点.现在,在你的代码中,任何时候你打电话给requireAuth你都会得到类似的东西,Handler User并且requireAuthId会给你一个Handler UserId相当于的东西Handler (Key User).您可以随意将这些更改为您想要的任何内容,但您必须更改YesodAuth类型类实例中的某些其他函数.
希望这可以帮助.Yesod岩石.需要一两个星期的时间才能感受到它是如何结合在一起的,但是当你做这样的事情是相当强大的.