在iris中,beforeactivation钩子必须在应用启动前、监听前注册路由,通过传入的router参数调用get/post等方法,并设executionrules;不可用app.get补充路由,party子路由不继承中间件需手动use。

在Iris框架中为BeforeActivation钩子注册自定义路由时,必须确保路由定义发生在应用启动前、服务器监听前,否则路由不会被加载到激活流程中。
理解BeforeActivation的执行时机
BeforeActivation是一个钩子函数,在Iris应用完成初始化但尚未注册任何HTTP处理器(包括路由)之前调用。它接收一个app *iris.Application和一个router *iris.Router参数,其中router是即将被激活的路由树根节点——此时你只能通过它注册路由,不能调用app.Listen或app.Run。
这一步不可跳过:若在此阶段调用app.Get等全局方法,路由将注册到默认路由器而非当前激活上下文,导致BeforeActivation中定义的路由失效。
基础写法:直接在BeforeActivation内注册GET路由
第一步:在iris.New()之后、app.Run()之前,调用app.WithoutVersionHeader().BeforeActivation()传入钩子函数。
第二步:在钩子函数内部,使用传入的router参数调用Get、Post等方法注册路由,例如router.Get("/health", healthHandler)。
第三步:必须显式调用router.SetExecutionRules(iris.ExecutionRules{Begin: iris.ExecutionOptions{Force: true}}),否则部分中间件和依赖注入可能不生效。
进阶写法:按模块分组注册路由
方法一:使用router.Party()创建子路由组
admin := router.Party("/admin")→admin.Get("/users", usersHandler)→admin.Post("/create", createHandler)。
方法二:嵌套多级Party实现路径隔离
v1 := router.Party("/api/v1")→usersAPI := v1.Party("/users")→usersAPI.Get("/{id:uint64}", getUserByID)。
【v1.Party()返回的子路由器不继承父级中间件,需手动调用Use()添加】
避坑要点:避免常见错误写法
不要在BeforeActivation钩子外调用app.Get来“补充”路由——这些路由会被挂载到默认路由器,与BeforeActivation中注册的路由不在同一激活上下文,可能导致404。
不要在钩子函数里调用app.ConfigureContainer或app.RegisterView——这些方法应在BeforeActivation之前完成。
若使用依赖注入(如hero.Register),必须在BeforeActivation调用前完成注册,否则钩子内handler无法解析参数。











