gpt4 book ai didi

haskell - 我不明白yesod中的这种家庭用品是做什么用的

转载 作者:行者123 更新时间:2023-12-02 06:25:15 25 4
gpt4 key购买 nike

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

最佳答案

脚手架中发生的很多事情可能不会立即显而易见。在配置/模型中,有一个持久实体定义如下:

User
name String
foo String

这将创建一个 User 类型(它是 PersistEntity 的实例)和一个 UserId 类型(如下使用):

instance PersistEntity User where
...
Key User = UserId

脚手架放入的原因:

type AuthId CopyWWWState = UserId

只是用户是一个逻辑引用点。现在,在您的代码中,每当您调用 requireAuth 时,您都会得到类似 Handler User 的内容,并且 requireAuthId 将为您提供一个 Handler UserId 相当于处理程序(关键用户)。您可以随意将它们更改为您想要的任何内容,但您必须更改 YesodAuth 类型类实例中的一些其他函数。

希望这有帮助。耶索德摇滚。需要一两周的时间才能感受到它是如何粘在一起的,但是当你这样做时,效果是非常强大的。

关于haskell - 我不明白yesod中的这种家庭用品是做什么用的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6269338/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com