iris mvc控制器注册后默认路径固定,必须在beforeactivation钩子中用b.router().party()创建新分组并显式绑定方法(如sub.get("/users", "getusers")),且需手动use()补全中间件、重声明别名、确保参数标注与by接收一致。

BeforeActivation里用b.Router().Party()重设前缀
控制器注册后无法直接改路由前缀,必须在激活前通过BeforeActivation钩子干预。Iris的MVC控制器一旦被mvc.Application.Handle()注册,其默认路径就固定了(比如/),但你可以在这个钩子中拿到当前控制器绑定的路由器实例,用Party()创建新分组并把原路由挂过去。
常见错误现象:在BeforeActivation里调用b.Router().Get()手动注册同名方法,结果出现重复路由 panic;或者试图在控制器结构体字段里存路径前缀,但MVC不读取这些字段。
- 必须在
BeforeActivation回调中操作,不能在Get()或Post()方法里改 -
b.Router()返回的是当前控制器专属的子路由器,不是全局app - 新前缀要显式挂载:比如
sub := b.Router().Party("/v2"),再调用sub.Get("/users", "GetUsers") - 原控制器方法(如
GetUsers)不会自动继承新前缀,必须显式用Handle()重新绑定到sub
动态拼接前缀需配合路由参数和正则约束
如果前缀本身带变量(比如按租户ID切分/t/{tenant}/api),就不能只靠Party()静态定义——得让路由支持路径参数,并在BeforeActivation里检查参数合法性,再决定是否允许挂载该控制器。
使用场景:SaaS系统中不同租户共享同一套控制器逻辑,但API路径强制隔离;或灰度发布时把/beta/users指向v2控制器,而/users仍走v1。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 路由定义必须含参数标注,例如
b.Router().Get("/t/{tenant:string}/users", "GetUsers") - 在
GetUsers方法签名里加ByTenant string接收参数,否则绑定失败 - 若需运行时拒绝某些
tenant值,得在BeginRequest里校验并提前ctx.StopExecution() - 注意:正则约束如
{tenant:alphabetical}要在路由定义时写死,不能在BeforeActivation里动态加
别名+URI生成时前缀变化要同步更新
给路由起过别名(如"user.list")后,如果通过BeforeActivation把它的实际路径从/users改成/v2/users,那c.Router().URI("user.list")返回的仍是旧路径——Iris的别名绑定发生在路由注册瞬间,不随Party()变更自动刷新。
容易踩的坑:前端页面用{{url "user.list"}}生成链接,上线后发现全是404,查半天才发现MVC前缀改了但别名没重建。
- 别名必须在最终生效的路由上重新声明,比如
sub.Get("/users", handler, "user.list") - 如果多个版本共用同一别名(如v1/v2都叫"user.list"),URI生成会随机返回其中一个,不可靠
- 模板中调用
url函数时,传入的参数键名(如id)必须和新路由里的参数名完全一致,大小写敏感
嵌套Party导致中间件丢失的补救方式
用b.Router().Party("/v2")创建子路由后,父级MVC应用注册的中间件(比如日志、CORS)默认不继承——这和app.Party()行为一致,但开发者常误以为MVC内部会自动透传。
性能影响:每次请求都要多一层Party()查找,不过实测在万级QPS下开销可忽略;真正的风险是中间件漏挂导致鉴权失效或响应头缺失。
- 必须显式调用
sub.Use()补全中间件,不能依赖父MVC的UseGlobal() - 若中间件本身依赖注入(如
auth.Service),需确保它已在BeforeActivation之前注册到容器 - 调试时可用
sub.Routes().Find("GET", "/v2/users")检查该路由的Handlers数组长度,确认中间件是否在列










