在 snap 中使用具有持久数据类型的类型安全路由
Using type safe routes with persistent datatypes in snap
我有一个使用 Persistent 进行存储的 Snap 应用程序,我正在尝试为 Persistent 中定义的数据类型生成类型安全路由。我正在使用 snap-web-routes package:.
我有以下模板 Haskell 函数,它创建 Group
和 GroupId
的数据类型:
share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase|
Group
name T.Text
deriving Show
|]
在我的 Application.hs
我有:
data AppUrl = AddLink GroupId deriving (Eq, Show, Read, Generic)
文档建议:
instance PathInfo AppUrl
鉴于上面的 Generic
推导,我需要做的就是这一切,但是这会随着
而爆炸
No instance for (PathInfo (KeyBackend SqlBackend Group))
arising from a use of ‘Web.Routes.PathInfo.$gdmtoPathSegments’
我的假设是这个错误表明 Haskell 不知道如何使用 Persistent 的数据类型自动创建实例定义。
我的下一次尝试是手动定义实例:
instance PathInfo AppUrl where
toPathSegments (AddLink groupId) = "add-link" : toPathPiece groupId : []
fromPathSegments (x:y:[]) = ????
我似乎无法弄清楚如何构建 GroupId
数据类型。
来自 Yesod 的优秀 Persistent tutorial 我知道数据类型定义为:
type GroupId = Key Group
newtype Key Group = GroupKey (BackendKey SqlBackend)
但后来我 运行 遇到了问题,因为 BackendKey
没有公开,所以我无法导入它并创建我自己的实例。我似乎找不到 public API 来在 Persistent 中创建这种数据类型。
The documentation for SqlBackend
显示关联数据类型 BackendKey
实例化为 SqlBackend
为
data BackendKey SqlBackend = SqlBackendKey {
unSqlBackendKey :: Int64
}
根据以下示例,这些信息应该足以编写您自己的 PathInfo
实例:
{-# LANGUAGE TypeFamilies #-}
import Database.Persist.Sql
import Data.Int (Int64)
foo :: BackendKey SqlBackend -> Int64
foo (SqlBackendKey key) = key
bar :: Int64 -> BackendKey SqlBackend
bar = SqlBackendKey
我有一个使用 Persistent 进行存储的 Snap 应用程序,我正在尝试为 Persistent 中定义的数据类型生成类型安全路由。我正在使用 snap-web-routes package:.
我有以下模板 Haskell 函数,它创建 Group
和 GroupId
的数据类型:
share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase|
Group
name T.Text
deriving Show
|]
在我的 Application.hs
我有:
data AppUrl = AddLink GroupId deriving (Eq, Show, Read, Generic)
文档建议:
instance PathInfo AppUrl
鉴于上面的 Generic
推导,我需要做的就是这一切,但是这会随着
No instance for (PathInfo (KeyBackend SqlBackend Group))
arising from a use of ‘Web.Routes.PathInfo.$gdmtoPathSegments’
我的假设是这个错误表明 Haskell 不知道如何使用 Persistent 的数据类型自动创建实例定义。
我的下一次尝试是手动定义实例:
instance PathInfo AppUrl where
toPathSegments (AddLink groupId) = "add-link" : toPathPiece groupId : []
fromPathSegments (x:y:[]) = ????
我似乎无法弄清楚如何构建 GroupId
数据类型。
来自 Yesod 的优秀 Persistent tutorial 我知道数据类型定义为:
type GroupId = Key Group
newtype Key Group = GroupKey (BackendKey SqlBackend)
但后来我 运行 遇到了问题,因为 BackendKey
没有公开,所以我无法导入它并创建我自己的实例。我似乎找不到 public API 来在 Persistent 中创建这种数据类型。
The documentation for SqlBackend
显示关联数据类型 BackendKey
实例化为 SqlBackend
为
data BackendKey SqlBackend = SqlBackendKey {
unSqlBackendKey :: Int64
}
根据以下示例,这些信息应该足以编写您自己的 PathInfo
实例:
{-# LANGUAGE TypeFamilies #-}
import Database.Persist.Sql
import Data.Int (Int64)
foo :: BackendKey SqlBackend -> Int64
foo (SqlBackendKey key) = key
bar :: Int64 -> BackendKey SqlBackend
bar = SqlBackendKey