iris mvc控制器必须使用指针接收者且方法名以大写http动词开头,需通过mvc.new().handle()挂载,路由参数与by前缀参数名须严格匹配。

控制器必须是结构体指针接收者
Iris MVC只识别以指针接收者定义的方法,非指针接收者会被完全忽略。哪怕方法签名完全正确,func (c UserController) Get() string 也不会被注册为路由处理器。
常见错误现象:启动后访问对应路径返回 404,日志里没有注册记录,且无任何报错提示。
- ✅ 正确写法:
func (c *UserController) Get() string - ❌ 错误写法:
func (c UserController) Get() string或func (c *UserController) get() string(首字母小写) - 控制器结构体本身可以是空结构体,如
type UserController struct{},无需字段
方法名必须以大写HTTP动词开头
Iris MVC通过方法名前缀自动映射HTTP动词和路径,不满足命名规则的方法不会被扫描为处理器。
使用场景:想让 GetProfile 处理 GET /user/profile,或 PostLogin 处理 POST /login。
- 支持的动词前缀:
Get、Post、Put、Patch、Delete、Head、Options、Connect - 禁止下划线:
Get_User、post_login会被跳过 - 大小写敏感:
getprofile不生效,GetProfile才有效
必须用 mvc.New().Handle() 挂载控制器
直接用 app.Get() 或 app.Handle() 注册函数,不会触发MVC机制——By参数绑定、依赖注入、BeforeActivation 等全部失效。
性能影响:绕过MVC挂载虽能跑通,但丧失结构化优势,后续扩展中间件、参数校验、日志追踪会越来越难维护。
- ✅ 正确流程:
userAPI := app.Party("/user")→mvc.New(userAPI).Handle(new(UserController)) - ❌ 错误流程:
app.Get("/user", func(ctx iris.Context) { ... })(这不是MVC控制器) - 若需自定义路径(如
/user/{id:int64}),必须在BeforeActivation中显式b.Handle("GET", "/user/{id:int64}", "GetByID")
参数绑定依赖路由定义与方法签名严格匹配
By参数绑定不是“模糊匹配”,而是精确字符串比对:路由中 {uid:int64} 要求方法参数名为 ByUid int64,少一个字母或大小写错就传零值,且无任何警告。
容易踩的坑:开发时改了路由参数名(比如从 {user_id:string} 改成 {uid:string}),但忘了同步更新方法参数名,结果 ByUserId 一直收不到值。
- 路由参数必须带类型标注:
{id:int64}✅,{id}❌(Iris不启用By绑定) - 方法参数必须以
By开头 + 路由键名首字母大写:{role:string}→ByRole string - 多个参数按顺序传递,不依赖名称顺序,但名称必须一一对应
BeginRequest)都只在 mvc.New().Handle() 流程中生效**——漏掉任何一个环节,功能就断在第一层。











