Iris的MVC控制器必须显式挂载:需用mvc.New(app.Party("/path"))创建mvc.Application,并调用Handle(&MyController{})传指针注册;路由由方法名(如GetUsers→GET /users)自动推导,自定义路径需在BeforeActivation中配置,依赖须提前注册。

直接注册控制器不生效?多半是 mvc.Application 没绑对路由分组,或没调用 Handle 注册实例——Iris 的 MVC 不是自动扫描,必须显式挂载。
控制器必须用 mvc.New(app.Party(...)) 初始化
Iris 的 MVC 不是全局注册机制,mvc.Application 本质是一个路由分组包装器。它必须基于 app.Party 创建,否则路由不会注入到主应用的路由树中。
-
mvc.New(app)是错的:虽然能编译,但app是根路由,mvc.Application内部会再建一层子分组,导致路径错位或 404 - 正确写法是
mvc.New(app.Party("/api"))或mvc.New(app.Party("/")),确保路径前缀和你控制器方法的隐式/显式路由一致 - 如果用了
app.Party("/admin").Party("/v1"),那 MVC 必须接在最终分组上:mvc.New(adminV1Party)
Handle(new(MyController)) 必须传指针,且不能重复注册
Handle 接收的是控制器实例指针,不是类型、不是接口、也不是 nil。传值或传错类型会导致静默失败(无 panic,但路由不注册)。
- ✅ 正确:
mvcApp.Handle(new(MyController))或mvcApp.Handle(&MyController{}) - ❌ 错误:
mvcApp.Handle(MyController{})(传值,方法集丢失) - ❌ 错误:
mvcApp.Handle(MyController)(类型名,非实例) - ❌ 错误:
mvcApp.Handle(nil)(panic: invalid memory address) - 重复调用
Handle同一实例不会报错,但后续注册会覆盖前序的路由映射,容易引发意外交互
方法名决定路由匹配逻辑,BeforeActivation 是补救出口
Iris 默认按「HTTP 方法 + 方法名」推导路径,比如 GetUsers → GET /users,PostLogin → POST /login。但这个推导是大小写敏感、无空格、无下划线的纯前缀匹配。
- 默认规则只识别八种 HTTP 方法前缀:
Get、Post、Put、Delete、Patch、Head、Options、Trace -
Get()映射到根路径(如/api),GetList()映射到/api/list,GetByID()→/api/by-id(注意下划线转连字符) - 若想自定义路径,比如把
GetProfile绑到/me,必须用BeforeActivation:b.Handle("GET", "/me", "GetProfile") -
BeforeActivation是唯一能在注册前修改路由行为的地方;错过这里,就只能改方法名或加中间件拦截重定向
依赖注入和上下文访问要靠结构体字段或参数声明
控制器里想用 iris.Context、数据库连接或服务对象,不能靠全局变量或 init 函数初始化——Iris 在每次请求时 new 控制器实例,字段需可注入或显式传参。
- 推荐方式:把依赖声明为结构体字段,并在
BeforeActivation中注册:b.Dependencies().Add(db),Iris 会自动赋值给同类型字段 - 上下文可作为方法参数:
func(c *MyController) Get(ctx iris.Context) string,也可声明为字段:Ctx iris.Context,但后者需手动绑定(不推荐) - 不要在控制器结构体里放不可序列化字段(如
*sql.DB)却不注册依赖——会导致 panic:“dependency not found” - 字段注入优先级低于参数注入;多个同类型依赖需用命名注册(
b.Dependencies().AddNamed("mysql", db))避免冲突
最常被忽略的是:MVC 的路由注册发生在 Handle 调用那一刻,而不是 main() 结束时。任何在 Handle 之后才初始化的依赖(比如数据库连接失败后延迟重试),控制器方法运行时就会 panic。务必确保依赖就绪再调用 Handle。


















