Iris MVC控制器方法必须用指针接收者、大写HTTP动词开头命名、通过mvc.Application注册并可选实现BeforeActivation自定义路由。

控制器结构体必须用指针接收者声明方法
Iris 的 MVC 模块只扫描并注册以 *T(结构体指针)为接收者的方法。如果写成值接收者,比如 func (c UserController) Get() {},该方法会被完全忽略,路由不生效,且无任何错误提示。
- ✅ 正确:
func (c *UserController) Get() string { return "ok" } - ❌ 错误:
func (c UserController) Get() string { return "ok" } - ⚠️ 注意:即使你只在
BeforeActivation里手动绑定,值接收者方法也无法被反射识别,b.Handle会找不到目标函数名
方法名必须以大写 HTTP 动词开头
Iris 依赖方法名前缀自动识别语义和默认路由行为。不是靠注解或配置,而是靠命名约定驱动绑定逻辑。
- GET 请求 → 方法名以
Get开头:Get、GetByID、GetUsersByRole - POST 请求 → 以
Post开头:PostLogin、PostOrder - PUT/PATCH/DELETE 同理:
PutProfile、PatchSettings、DeleteAvatar - ? 禁止下划线:
get_user、Post_Login、delete_avatar全部失效 —— 反射器直接跳过 - ? 首字母小写也不行:
getUser不会被识别为 GET 处理器
注册控制器必须走 mvc.Application 流程
直接用 app.Get("/path", handler) 绑定函数,就脱离了 MVC 上下文,By 参数、依赖注入、BeforeActivation 等特性全部不可用。
- ✅ 必须这样注册:
mvc.New(app.Party("/api")).Handle(new(UserController)) - ✅ 若需依赖注入,还要提前调用
app.Register(...)并确保控制器字段带inject:""标签 - ⚠️ 常见疏漏:忘了
Party的路径前缀,导致路由实际注册到/下,但你预期是/user - ⚠️ 更隐蔽的坑:没调用
Handle(),只写了mvc.New(...),控制器根本没挂载,请求 404 且无日志提示
想用自定义路径?必须实现 BeforeActivation
默认规则只匹配根路径(如 Get() → GET /),所有带参数或子路径的路由,都得手动声明。Iris 不推导、不猜测。
- 定义:
func (c *UserController) BeforeActivation(b mvc.BeforeActivation) { b.Handle("GET", "/profile/{id:long}", "GetProfile") } - 对应方法:
func (c *UserController) GetProfile(id int64) string { ... } - ⚠️ 路径类型必须显式标注:
{id:long}有效,{id}会导致id永远是 0 - ⚠️ 方法名必须和
b.Handle第三个参数严格一致,大小写、拼写差一个字符就 panic
mvc.New().Handle() + (可选但关键的)BeforeActivation。少一环,它就只是个普通 Go 结构体,不会参与任何 HTTP 路由或绑定。


















