Example #1
0
// 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
}
Example #2
0
// 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
}