必须先挂载MVC实例到Party,否则Handle不生效;正确做法是app.Party("/api")后传入mvc.New()再Handle();方法名不自动映射路径,需BeforeActivation显式绑定;By参数仅在MVC注册路径下有效且须严格匹配命名与类型。

必须先挂载MVC实例到Party,否则Handle不生效
控制器注册失败的最常见原因,就是跳过了 mvc.New() 与 app.Party() 的组合使用。Iris 的 MVC 不是全局自动扫描,而是强依赖路由分组绑定。直接写 mvc.New(app).Handle(new(MyController)) 是错的——app 本身不是 Party,无法承载 MVC 的路径前缀逻辑。
正确做法是:先用 app.Party("/api") 创建子路由分组,再把该分组传给 mvc.New(),最后在回调或链式调用中执行 Handle():
api := app.Party("/api")
mvc.New(api).Handle(new(UserController))
- 若想批量注册多个控制器且共用同一前缀(如
/api/v1),复用同一个Party实例即可 - 若控制器需隔离前缀(如
/admin和/user),就分别创建不同Party,各自配独立mvc.New() -
Handle()必须在mvc.New(xxx)链路内完成,写在外面(比如先new()再全局调用Handle())完全无效
方法名决定默认路径,但子路径必须手动注册
Iris 不会把 GetUser 自动映射到 /user;它只对根路径(即 Party 前缀后无额外路径)做方法名推导。想支持 /users/{id:long} 这类 RESTful 路径,必须用 BeforeActivation 显式绑定。
例如:
func (c *UserController) BeforeActivation(b mvc.BeforeActivation) {
b.Handle("GET", "/{id:long}", "GetByID")
b.Handle("PUT", "/{id:long}", "PutByID")
}
-
{id:long}中的long是 Iris 内置别名,等价于int64;写成{id}或{id:int}会导致参数始终为 0 -
"GetByID"必须是控制器中真实存在的方法名,大小写敏感,拼错就 404 - 不要指望
PostCreateOrder自动挂到/create-order—— Iris 没这层约定,全靠你手写b.Handle()
By 参数绑定只在 MVC 注册路径下有效
By 前缀参数(如 ByUserID int64)不是通用机制,它只在通过 mvc.Application.Handle() 注册的控制器方法中起作用。如果你用 app.Get("/xxx", handler) 手写路由,By 完全被忽略。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
要让 ByUserID 生效,三要素缺一不可:
- 控制器已用
mvc.New(party).Handle(new(C))注册 - 路由路径含显式类型标注的命名参数:
userAPI.Get("/profile/{uid:int64}", "Profile") - 方法签名参数名严格匹配:
func (c *C) Profile(ByUid int64) string(注意By+Uid首字母大写)
漏掉任何一条,参数值都是零值,且框架不报错 —— 这是最容易踩却最难排查的坑。
调试绑定是否成功,直接看 404
启动服务后,别急着查日志或断点,先用 curl 或浏览器访问对应路径。返回 404 就说明 MVC 绑定没走通,按顺序检查:
- 是否漏了
app.Run()?没有它,所有路由都不启动 - 是否把
Handle()写在了Configure回调外?例如mvc.Configure(party, func(_ *mvc.Application){}); app.Handle(...)是错的 - 控制器方法是否导出(首字母大写)?
get()不会被识别,必须是Get() - 路径大小写是否和注册时完全一致?
/API和/api是两个路由
真正麻烦的不是配置多难,而是错误静默——Iris 不会在绑定失败时 panic 或 log warning,它只是默默跳过。所以验证必须靠实际请求响应,而不是“我以为写对了”。


















