Iris MVC需显式注册:用mvc.New(app.Party("/prefix"))创建分组,再调用Handle()挂载控制器;方法名须首字母大写且匹配HTTP动词(如Get);字段注入依赖注册时机、类型精确匹配及首字母大写指针声明;模板路径相对main.go目录,需显式设layout。

必须显式注册 MVC 应用并绑定控制器,不能靠自动扫描;目录结构是人为约定,Iris 本身不强制要求,但字段注入和模板路径依赖它。
怎么初始化 mvc.Application 并挂载到路由组
不是直接 new controller 就能跑,得先用 mvc.New() 包一层路由分组。这个分组决定了控制器所有方法的公共前缀。
-
mvc.New(app.Party("/admin"))表示所有控制器方法都带/admin前缀,比如Get()对应GET /admin - 别用
app.Party("/")后直接Handle()—— 这会覆盖根路由,导致静态文件或 API 路由失效 - 多个 MVC 分组可以共存:
mvc.New(app.Party("/api")).Handle(new(APIController))和mvc.New(app.Party("/")).Handle(new(HomeController)) - 注册顺序影响中间件作用范围:在
mvc.New(...)后、Handle()前调用.Router().Use(...),中间件才对当前分组生效
控制器方法名和 HTTP 方法怎么匹配
Iris 不解析注解或标签,只认方法名前缀 + 请求动词,大小写敏感,且不支持自定义映射(除非用 BeforeActivation)。
- 标准方法名:
Get()、Post()、Put()、Delete()、Patch()、Head()、Options()、Connect() - 方法名必须首字母大写,
get()或GetHome()不会被识别为 GET 处理器(GetHome()是合法方法,但需手动注册) - 参数类型有限制:只支持
int、int64、string、bool及其指针,路径参数自动转换,query 不自动绑定 - 返回值类型决定响应行为:
string直接写入响应体;error触发 500;mvc.Result(如mvc.View)交由 Iris 渲染
为什么 controller 字段注入总是 nil 或 panic
字段注入不是“写了就能用”,它依赖三要素:注册时机、类型精确匹配、字段可导出。漏掉任一环都会静默失败或运行时 panic。
- DB 注入必须在
mvc.New(...).Handle()之前完成:app.Register(func() *gorm.DB { return db }),否则报no dependency found for type - 字段声明必须是首字母大写 + 指针类型:
DB *gorm.DB✅,db *gorm.DB❌(不可导出),DB gorm.DB❌(非指针) - 不要在 controller 结构体里初始化字段:
DB: db会覆盖注入值;Iris 在每次请求时新建 controller 实例并注入依赖 - 调试时加一句
if c.DB == nil { panic("DB not injected") },比查半天日志快得多
模板路径和 layout 怎么设才不 404
app.RegisterView() 的路径是相对 main.go 所在目录的,不是 controller 文件位置,也不是 GOPATH —— 这是 90% 模板 404 的根源。
- 正确写法:
app.RegisterView(iris.HTML("./web/views", ".html")),假设main.go在项目根目录,模板在./web/views/index.html - layout 必须显式启用:
c.Ctx.ViewLayout("layouts/main.html"),且模板中要有{{define "content"}}...{{end}}和{{template "content" .}} -
ctx.View("index.html")中的路径是相对于RegisterView设置的目录,不带前缀./web/views/ - Jet 模板引擎需额外注册:
iris.Jet("./web/views", ".jet"),HTML 和 Jet 不能混用同一目录而不指定引擎
最常被忽略的是:MVC 的 ViewData 和 ctx.View() 是强绑定的,而 ctx.JSON() 会提前锁死响应头,一旦误调就再也 render 不出 HTML —— 这个失败没有错误提示,只有空白页。


















