ColdFusion中GetComponentMetaData返回函数顺序随机如何获取CFC定义顺序
ColdFusion获取与CFC定义顺序一致的函数列表的可行方案
GetComponentMetaData 底层默认使用哈希结构存储函数元数据,所以返回的函数列表不会保留CFC文件中的声明顺序,你可以通过以下几种方案实现需求:
- 方案1:自定义属性标记顺序(全版本兼容)
你可以在CFC的每个函数声明中增加自定义的order属性,手动标记函数的排序权重:
调用<!--- 标签写法CFC ---> <cffunction name="getUserInfo" order="1"> <!--- 函数逻辑 ---> </cffunction> <cffunction name="updateUserInfo" order="2"> <!--- 函数逻辑 ---> </cffunction> <!--- 脚本写法CFC ---> <cfscript> function getUserInfo() order=1 { // 函数逻辑 } function updateUserInfo() order=2 { // 函数逻辑 } </cfscript>GetComponentMetaData获取函数列表后,按照order属性对列表做排序即可,该方案兼容所有主流ColdFusion版本,实现成本极低。 - 方案2:解析CFC源文件提取顺序(无侵入,全版本兼容)
如果你不想修改原有CFC代码,可以直接读取CFC源文件的文本内容,通过正则匹配提取函数声明的顺序:
该方案无需修改原有业务代码,提取的顺序和CFC文件中的定义顺序完全一致,如果需要过滤注释内的函数声明,可以先预处理移除CFC中的注释内容再做匹配。<cfscript> // 读取CFC文件内容 cfcPath = expandPath("./YourComponent.cfc"); cfcContent = fileRead(cfcPath); orderedFunctions = []; // 匹配标签写法的cffunction tagReg = '<cffunction[^>]+name\s*=\s*["'']([\w]+)["'']'; tagMatches = reMatchAll(tagReg, cfcContent); for (match in tagMatches) { arrayAppend(orderedFunctions, match[1]); } // 匹配脚本写法的function scriptReg = 'function\s+([\w]+)\s*\('; scriptMatches = reMatchAll(scriptReg, cfcContent); for (match in scriptMatches) { arrayAppend(orderedFunctions, match[1]); } </cfscript> - 方案3:高版本ColdFusion内置参数实现(最低要求ColdFusion 2018及以上)
ColdFusion 2018及更新版本对GetComponentMetaData新增了preserveOrder可选参数,传入true即可直接获取按定义顺序排序的函数列表:
该方案无需额外开发,是最简单的实现方式,仅需要注意服务端的ColdFusion版本是否满足要求。<cfset componentMeta = GetComponentMetaData("YourComponent", true)> <cfset orderedFunctionList = componentMeta.functions>
补充说明:如果你的CFC存在继承逻辑,上述方案默认仅返回当前CFC定义的函数,若需要包含父类函数,可以按照继承层级从父类到子类依次解析,将结果拼接即可。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

