初始化MVC Application实例必须绑定到Party路由组(如mvc.New(app.Party("/api/v1"))),不可直接传app;控制器方法名需以大写HTTP动词开头(如Get、PostCreate)自动映射路径;依赖通过BeforeActivation注入;返回值自动JSON化但不可控,推荐显式调用ctx.StatusCode()等。

直接用 mvc.New(app.Party("/api")) 初始化 MVC 应用,再 Handle(new(YourController)) 注册控制器——这是唯一可靠起点,别在 main.go 里写 handler 函数。
怎么初始化 MVC Application 实例
必须绑定到一个 Party 路由组,不能直接传 app;否则所有路由会挂到根路径,后续嵌套和中间件管理全乱套。
-
app.Party("/api/v1")是推荐前缀,版本控制、权限隔离都靠它 - 不要用
app.Party("/"),哪怕只是本地测试——它会让Get()方法响应GET /,掩盖路径意图 - 如果要用多级 Party(比如
/api/v1/admin/users),先拆成app.Party("/api/v1").Party("/admin").Party("/users"),再传给mvc.New(),避免路径拼接错误
控制器方法名和 HTTP 动词怎么匹配
Iris 不靠注解或配置,只认方法名前缀:大小写敏感,且必须是首字母大写的完整动词。
-
Get()→GET /,PostCreate()→POST /create,PutByID()→PUT /by-id - 参数名会自动转为路径变量或表单键,如
func(c *UserCtrl) GetByID(id int64)匹配GET /{id:long},无需手动写ctx.Params().GetInt64("id") - 自定义路径必须用
BeforeActivation,例如:b.Handle("POST", "/import", "ImportFromExcel"),否则方法名不匹配就根本不会被注册
依赖怎么注入到 Controller 结构体里
靠 BeforeActivation 钩子统一注册,不是靠构造函数,也不是靠字段标签——Iris 的依赖注入只发生在激活阶段。
- 在 controller 文件里定义:
func(c *OrderCtrl) BeforeActivation(b mvc.BeforeActivation) { b.Dependencies().Add(c.service) } - 结构体字段必须是导出的(首字母大写),且类型要和
Add()传入的一致,否则运行时报dependency not found - 别在
Get()方法里 new service 实例——每次请求都新建,既浪费资源又破坏单例语义 - 跨模块复用(比如订单校验用户)只需在另一个 controller 的
BeforeActivation里Add()同一个实例,不用复制逻辑
为什么 Controller 方法返回 string 或 struct 就能自动 JSON 化
因为 Iris MVC 默认使用 mvc.Response 包装返回值,并调用 ctx.JSON();但这个行为不可控,容易踩坑。
- 返回
string→ 自动设Content-Type: text/plain,不是 JSON - 返回结构体 → 自动
JSON,但无状态码控制,错误时也返回 200 - 真正可控的方式是显式调用
ctx.StatusCode()+ctx.JSON()+ctx.StopWithStatus(),且三者顺序不能错 - 想统一错误格式?别依赖返回值,用
panic(&BizError{...})配合全局recover中间件,这是目前最稳的路径
最容易被忽略的是:MVC 的生命周期完全独立于普通路由,app.UseGlobal() 中间件不会自动进入 controller 方法——必须在 Party 上显式 Use(),或在 BeforeActivation 里绑定到具体路由。否则日志、鉴权、超时全失效。


















