必须调用app.ConfigureContainer(),否则Iris MVC模块不初始化依赖注入容器,app.Controller()会静默失败或panic,导致路由404且难以排查;需在注册控制器前调用,并在其中绑定自定义依赖如*sql.DB。

用 controller 注册路由时必须调用 app.ConfigureContainer()
不调用 app.ConfigureContainer(),Iris 的 MVC 模块不会初始化依赖注入容器,app.Controller() 会静默失败或 panic。这是新手最常踩的坑——写了 controller,但路由压根没注册上,curl 返回 404 却找不到原因。
实操建议:
- 必须在
app.Controller(&MyController{})之前调用app.ConfigureContainer() - 如果用了自定义依赖(比如数据库实例),需在
ConfigureContainer里显式绑定:api.RegisterValue((*sql.DB)(nil), db) - 不要在 controller 方法里直接 new 实例;所有依赖应通过结构体字段注入,Iris 会自动解析
controller 方法签名必须是 func(iris.Context) 或带依赖参数
Iris MVC 不接受任意签名的 handler 函数。写成 func() error 或 func(*sql.DB) string 都会编译失败或运行时报错 invalid controller method signature。
常见合法写法:
-
func(c iris.Context)—— 最基础,自己从c取参数、写响应 -
func(c iris.Context, s *MyService)—— 自动注入*MyService实例(前提是已注册) -
func(c iris.Context, id int64, name string) string—— 路径参数自动绑定(需路径含/:id/:name)
注意:返回值不能是裸 error;若要返回错误,应调用 c.StatusCode(400) + c.JSON() 显式处理。
REST 响应体统一用 rest.OK / rest.Error(v14 推荐)
v14 引入了 rest 包作为标准响应辅助,替代手写 c.JSON(200, ...)。不用它也能跑,但会丢失集中错误映射、Content-Type 自动设置、以及未来版本的兼容性保障。
实操要点:
-
rest.OK(c, data)→ 自动设 200 + application/json -
rest.NoContent(c)→ 204,适合 DELETE 成功后无 body - 业务错误别直接
panic,改用rest.Error(c, "user not found", 404),它会走全局错误映射逻辑 - 确保已启用集中错误处理:
app.UseRouter(rest.ErrorHandler())
路径参数和 Query 绑定容易混淆类型
写 GET /users/:id 时,:id 默认是 string 类型。如果 controller 方法参数写 id int,Iris 会尝试转换但失败时不报错,而是传 0 或空值,导致查不到数据却难以定位。
安全做法:
- 路径参数强制用
int64或string,避免int(平台相关) - Query 参数推荐用结构体绑定:
c.URLParamDecode("q")或自定义struct+c.ReadQuery(&q) - 对关键 ID,加校验逻辑:
if id
复杂查询场景下,别依赖自动绑定;先 ReadQuery 到 struct,再手动校验字段有效性,比靠框架隐式转换更可控。


















