我不明白yesod中这类家庭的东西是什么

Dav*_*aly 13 haskell yesod

我浏览了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在这些类中使用类型系列有什么好处?

mxc*_*mxc 7

脚手架中有相当多的东西可能不会立即显现出来.在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岩石.需要一两个星期的时间才能感受到它是如何结合在一起的,但是当你做这样的事情是相当强大的.