如何修改Yesod子站点URL?能否重命名yesod-auth端点?
嘿,这两个Yesod子站点的URL问题不难解决,完全不用改本地yesod-auth包!我给你分点说清楚:
1. 修改自定义子站点的URL
如果是你自己开发的子站点,改URL非常直接,分两步操作:
修改子站点内部路由:在子站点的路由定义里,直接把路径换成你想要的。比如原本的子站点路由是:
mkYesodSubData "BlogSub" [parseRoutes| /posts BlogPostsR GET /post/#Int BlogPostR GET |]改成葡萄牙语路径:
mkYesodSubData "BlogSub" [parseRoutes| /publicacoes BlogPostsR GET /publicacao/#Int BlogPostR GET |]调整主站点挂载前缀:如果子站点挂载在主站点的某个路径下(比如原来的
/blog),也可以在主站点路由里修改这个前缀:mkYesod "App" [parseRoutes| / HomeR GET /blogue BlogSubR BlogSub getBlogSub |]这样子站点的所有端点就会变成
/blogue/publicacoes、/blogue/publicacao/1这类路径。
2. 重命名yesod-auth的端点(替换/login、/email/register为葡萄牙语路径)
Yesod-auth本身支持自定义路由,核心是通过覆盖authSettings里的authRoutes字段来实现,完全不用碰源码:
首先导入必要的模块:
import Yesod.Auth import Yesod.Auth.Email -- 如果你用邮箱认证的话
然后在主站点的YesodAuth实例中,自定义认证路由:
instance YesodAuth App where type AuthId App = UserId -- 替换成你实际的AuthId类型 authenticate = ... -- 保留你原来的认证逻辑 loginDest _ = HomeR -- 登录后跳转目标,按需修改 logoutDest _ = HomeR -- 登出后跳转目标,按需修改 -- 重点:替换默认的认证路由路径 authSettings = defaultAuthSettings { authRoutes = [ ( "entrar", getLoginR ) -- 替换原/login , ( "sair", postLogoutR ) -- 替换原/logout(可选) , ( "cadastrar", getRegisterR ) -- 替换原/email/register , ( "recuperar-senha", getForgotR ) -- 替换密码重置路径(可选) , ( "resetar-senha/#Text", getResetR ) -- 替换密码重置确认路径(可选) -- 其他需要的认证路由都可以在这里调整 ] }
配置完成后,你的认证端点就会变成/entrar(登录)、/cadastrar(注册),完美符合需求。
如果需要兼容旧路径(比如用户可能收藏了旧链接),可以在主站点路由里加重定向规则:
mkYesod "App" [parseRoutes| -- 其他路由... /login LoginRedirectR GET /email/register RegisterRedirectR GET |]
然后实现对应的handler:
getLoginRedirectR :: Handler Html getLoginRedirectR = redirect "/entrar" getRegisterRedirectR :: Handler Html getRegisterRedirectR = redirect "/cadastrar"
不需要兼容的话,这一步可以跳过。
内容的提问来源于stack exchange,提问作者Alexandre Lucchesi
相关产品推荐
相关产品推荐

