// NewCustomControllerRouter 创建定制化控制器路由 // instance:控制器对象 // name:控制器路由名称,为空时使用instance类名(不含Controller) // methodsInfo:路由方法信息数组,RouterName为空时使用方法名 // return:执行成功则返回控制器的router.Router func NewCustomControllerRouter(instance interface{}, name string, methodsInfo []RouterMethod) router.Router { var instanceType = reflect.TypeOf(instance) if !meta.IsStructPtrType(instanceType) { panic(ErrorNotStructPtr.Format(instanceType.String()).Error()) } var methods = make([]*meta.MethodMetadata, len(methodsInfo)) //遍历方法 for k, v := range methodsInfo { var method, ok = instanceType.MethodByName(v.MethodName) if !ok { panic(ErrorNoSpecificMethod.Format(instanceType.String(), v.MethodName).Error()) } var mMd, err = meta.AnalyzeStructMethod(&method) if err != nil { panic(err) } methods[k] = mMd } // 生成路由 if name == "" { name = strings.TrimSuffix(instanceType.Elem().Name(), "Controller") } var controllerRouter = NewSpaceRouter(name) for i, m := range methods { var info = methodsInfo[i] var rname = info.RouterName if rname == "" { rname = m.Name } var mr = NewSpaceRouter(info.RouterName) var excutor = NewAdvancedExecutor(m) mr.AddChildren(HttpResultRouter(string(info.HttpMethod), func() router.RouterExcutor { return excutor })) controllerRouter.AddChild(mr) } return controllerRouter }
// NewControllerRouter 创建控制器路由,根据方法返回值确定该方法处理哪种形式的http请求 // instance:控制器对象 // 控制器方法必须满足如下格式: // func (this *SomeController) Method(param *ParamStruct) web.Result // this:必须是控制器指针 // param:可以没有或者有多个,如果有则类型必须为结构体指针类型 // 第一个返回结果最好是能够赋值给web.Result接口,也可以是其他类型 // return:执行成功则返回控制器的router.Router func NewControllerRouter(instance interface{}) router.Router { var instanceType = reflect.TypeOf(instance) if !meta.IsStructPtrType(instanceType) { panic(ErrorNotStructPtr.Format(instanceType.String()).Error()) } var methods = make([]*meta.MethodMetadata, 0) //遍历控制器方法 var err = meta.ForeachMethod(instanceType, func(method reflect.Method) error { var mMd, err = meta.AnalyzeStructMethod(&method) if err != nil { return err } // 对返回值进行检查,符合要求的方法才能作为接口使用 err = CheckResult(mMd) if err != nil { return err } methods = append(methods, mMd) return nil }) if err != nil { panic(err) } var controllerName = instanceType.Elem().Name() controllerName = strings.TrimSuffix(controllerName, "Controller") var controllerRouter = NewSpaceRouter(controllerName) for _, m := range methods { var mr = NewSpaceRouter(m.Name) var excutor = NewAdvancedExecutor(m) mr.AddChildren(HttpResultRouter(m.Return[0].Name(), func() router.RouterExcutor { return excutor })) controllerRouter.AddChild(mr) } return controllerRouter }