ColdFusion cfc方法可以确定自己的名字吗?

Rya*_*lle 13 coldfusion cfc

我正在创建一个API,在每个方法中,我都会调用一个用于审计和故障排除的日志记录方法.就像是:

<cffunction name="isUsernameAvailable">
    <cfset logAccess(request.userid,"isUsernameAvailable")>
    ......
</cffunction>
Run Code Online (Sandbox Code Playgroud)

我想避免手动重复方法名称.有没有办法以编程方式确定它?

我看过GetMetaData(),但它只返回有关组件的信息(包括所有方法),但没有关于当前调用哪个方法的信息.

Ter*_*yan 11

所以现在3种方式.

如果您使用的是ColdFusion 9.0或更高版本,那么现在有一个名为GetFunctionCalledName()的函数.它会返回你想要的东西. http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WS7cc222be8a31a47d-6e8b7083122cebfc8f2-8000.html

要么

使用ColdSpring和面向方面编程(http://www.coldspringframework.org/coldspring/examples/quickstart/index.cfm?page=aop)为您处理此问题.

要么

使用cfthrow生成包含以下信息的堆栈跟踪:

<cffunction name="determineFunction" output="FALSE" access="public"  returntype="string" hint="" >
<cfset var functionName ="" />
<cfset var i = 0 />
<cfset var stackTraceArray = "" />
<cftry>
<cfthrow />
<cfcatch type="any">
    <cfset stacktraceArray = ListToArray(Replace(cfcatch.stacktrace, "at ", " | ", "All"), "|") />

    <!---Rip the right rows out of the stacktrace --->
    <cfloop index ="i" to="1" from="#ArrayLen(stackTraceArray)#" step="-1">
        <cfif not findNoCase("runFunction", stackTraceArray[i]) or FindNoCase("determineFunction", stackTraceArray[i])>
            <cfset arrayDeleteAt(stackTraceArray, i) />
        </cfif>
    </cfloop>

    <!---Whittle down the string to the func name --->
    <cfset functionName =GetToken(stacktraceArray[1], 1, ".") />
    <cfset functionName =GetToken(functionName, 2, "$")/>
    <cfset functionName =ReplaceNoCase(functionName, "func", "", "once")/>

    <cfreturn functionName />
</cfcatch>
</cftry></cffunction>
Run Code Online (Sandbox Code Playgroud)

我的建议是使用getFunctionCalledName,或者如果没有使用CF 9 ColdSpring,因为它可能会给你带来一些其他东西.


eth*_*eal 1

好吧,你可以尝试这个:

\n\n
 <cffunction name="getFunctionName" returntype="any">\n        <cfset meta =getMetaData(this)> \n        <cfreturn meta.functions[numberOfFunction].name>\n    </cffunction>\n
Run Code Online (Sandbox Code Playgroud)\n\n

我尝试了各种方法,但这并不准确,因为这些函数似乎是按相反的字母顺序添加到函数数组中的。这似乎是有限制的(并且不能解决问题)。我想可以调用一些本机java代码,但我需要对此进行研究。

\n\n

ThisThis看起来像是对相关内部函数的有趣阅读。

\n\n

回复:关于冷泉的另一个答案。我发现这篇关于 Coldspring 函数元数据的深入文章。

\n\n

相关问题:如何获取在 ColdFusion 中扩展我的\xe2\x80\x99s 的组件的名称?

\n