自定义路线,但保留一些路线作为自动路线

Custom route, but keep some routes as the automatic ones

我在 CRUD 的基础上添加了一些操作,我想要自定义路由到新的操作。但是,请保持 CRUD 操作具有相同的路径(例如 /ShowPost?postId=[uuid]

instance HasPath PostsController where
    -- ...
    pathTo ShowPostAction { postId } = "/ShowPost?postId=" ++ tshow postId


instance CanRoute PostsController where
   parseRoute' = do
       let posts = do
           string "/Posts"
           optional "/"
           endOfInput
           pure PostsAction

       let showPost = do
           string "/ShowPost?postId="
           postId <- parseId
           optional "/"
           endOfInput
           pure ShowPostAction { postId }


       posts <|> showPosts -- ...

我假设 CanRoute 部分没有正确解析,因为我在导航到 /ShowPost?postId=...

时得到了一个 404 页面

这里的问题是 ?postId= 不是请求路径的一部分,因为它是请求的查询字符串的一部分。

给定像 /ShowPost?postId=abc 这样的请求,那么解析器输入实际上只是 /ShowPost?postId=abc 只能通过 ?context 变量获得。

您可以尝试这样的操作(未测试):

instance HasPath PostsController where
    -- ...
    pathTo ShowPostAction { postId } = "/ShowPost?postId=" ++ tshow postId

-- Define the auto route instance
instance AutoRoute PostsController

instance CanRoute PostsController where
   parseRoute' = do
       let customRoutes = ...
       customRoutes <|> (autoRoute @PostsController)

基本上这将首先使用您的 customRoutes 解析器,然后尝试通过 AutoRoute.

回退到解析器