2009-02-19 10 views
13

मैं एक एपीआई बना रहा हूं, और प्रत्येक विधि के भीतर मैं ऑडिटिंग और समस्या निवारण के लिए लॉगिंग विधि पर कॉल करता हूं। कुछ ऐसा:क्या एक कोल्डफ्यूजन सीएफसी विधि अपना नाम निर्धारित कर सकती है?

<cffunction name="isUsernameAvailable"> 
    <cfset logAccess(request.userid,"isUsernameAvailable")> 
    ...... 
</cffunction> 

मैं मैन्युअल रूप से विधि नाम दोहराना चाहता हूं। क्या प्रोग्रामेटिक रूप से इसे निर्धारित करने का कोई तरीका है?

मैंने GetMetaData() को देखा है, लेकिन यह केवल घटक (सभी विधियों सहित) के बारे में जानकारी देता है लेकिन वर्तमान में कौन सी विधि को बुलाया जा रहा है इसके बारे में कुछ भी नहीं।

उत्तर

1

वैसे आप इस कोशिश कर सकते हैं:

<cffunction name="getFunctionName" returntype="any"> 
     <cfset meta =getMetaData(this)> 
     <cfreturn meta.functions[numberOfFunction].name> 
    </cffunction> 

मैं विभिन्न चीजों की कोशिश की है, और इस कार्य के रूप में सही नहीं है रिवर्स वर्णमाला के क्रम में कार्यों की सरणी के लिए जोड़ा जा करने लगते हैं। यह सीमित लगता है (और समस्या को हल नहीं)। मुझे लगता है कि कुछ देशी जावा कोड का आह्वान किया जा सकता है, लेकिन मुझे इसकी जांच करने की आवश्यकता होगी।

This और This संबंधित आंतरिक कार्यों पर दिलचस्प पढ़ने की तरह दिखते हैं।

पुन: शीतप्रदर्शन पर दूसरा उत्तर। मुझे ठंड के साथ समारोह मेटाडाटा पर this in depth article मिला।

संबंधित प्रश्न: How to get the name of the component that’s extending mine in ColdFusion?

11

तो अब 3 तरीके।

यदि आप कोल्डफ्यूजन 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> 

मेरे सिफारिश पर सीएफ 9 Coldspring getFunctionCalledName, या यदि नहीं का उपयोग किया जाएगा के रूप में यह शायद होगा आपको कुछ और चीजें खरीदते हैं।

+0

सर्दी पर अच्छा कॉल, लेकिन आपको लगता है कि यह जटिल नहीं होगा। – ethyreal

4

मैं w/tpryan से सहमत हूं। कोल्डस्पिंग यह बहुत आसान बनाता है। हालांकि, यहां एक और विकल्प है। स्टैक ट्रेस को पार्स करने के बजाय, आप सीएफसी फ़ाइल को स्वयं पार्स कर सकते हैं।

<cffunction name="foo" displayname="foo" hint="this is just a test function" access="public" returntype="string"> 
    <cfset var test = getFunctionName(getMetaData().path, getPageContext().getCurrentLineNo()) /> 
    <cfreturn test /> 
</cffunction> 

<cffunction name="getFunctionName" hint="returns the function name based on the line number" access="public" returntype="string"> 
    <cfargument name="filepath" type="string" required="true" /> 
    <cfargument name="linenum" type="any" required="true" /> 
    <cfset var line = "" /> 
    <cfset var functionName = "" /> 
    <cfset var i = 1 /> 
    <!---- loop over CFC by line ----> 
    <cfloop file="#ARGUMENTS.filepath#" index="line"> 
     <cfif findNoCase('cffunction', line, 1)> 
      <cfset functionName = line /> 
     </cfif> 
     <cfif i EQ ARGUMENTS.linenum><cfbreak /></cfif> 
     <cfset i++ /> 
    </cfloop> 
    <!---- parse function name ----> 
    <cfset functionName = REMatchNoCase("(\bname=[""|'])+[a-z]*[""|']", functionName) /> 
    <cfset functionName = REMatchNoCase("[""']+[a-z]*[""']", functionName[1]) /> 
    <cfset functionName = ReReplaceNoCase(functionName[1], "[""']", "", "all") /> 
    <!---- return success ----> 
    <cfreturn functionName /> 
</cffunction> 

ऊपर ColdFusion 8. के ​​लिए लिखा है CFLOOP लाइन द्वारा फ़ाइलों लाइन पर पाशन के लिए समर्थन जोड़ा (और स्मृति में पूरे फ़ाइल को पढ़ने नहीं है)। मैंने स्टैक ट्रेस विधि बनाम फ़ाइल पार्सिंग की तुलना में कुछ परीक्षण किए। दोनों ने एक छोटे सीएफसी पर समान रूप से अच्छी तरह से प्रदर्शन किया जिसे सीधे एक सीएफएम टेम्पलेट से बुलाया जा रहा था। जाहिर है यदि आपके पास बहुत बड़े सीएफसी हैं तो पार्सिंग विधि थोड़ा धीमी हो सकती है। दूसरी तरफ, यदि आपके पास एक बड़ा स्टैक ट्रेस है (जैसे कि आप किसी भी लोकप्रिय ढांचे का उपयोग कर रहे हैं) तो फ़ाइल पार्सिंग तेज हो सकती है।

- = विवा ColdFusion = -

1

मैं एक और तरीका है कि काम कर सकता था के बारे में सोचा।

सेटअप इस तरह एक OnMissingMethod कुछ:

<cffunction name="onMissingMethod"> 
    <cfargument name="missingMethodName" type="string"> 
    <cfargument name="missingMethodNameArguments" type="struct"> 

    <cfset var tmpReturn = ""> 
    <cfset var functionToCallName = "Hidden" & Arguments.missingMethodName> 
    <cfset arguments.missingMethodArguments.calledMethodName = Arguments.missingMethodName> 
    <cfinvoke method="#functionToCallName#" argumentcollection="#Arguments.missingMethodArguments#" returnvariable="tmpReturn" /> 
    <cfreturn tmpReturn> 
</cffunction> 

फिर एक उपसर्ग ("छुपे हुए" इस उदाहरण में) के साथ नियमित रूप से तरीकों में से प्रत्येक के नाम, और उन्हें निजी के रूप में चिह्नित करें। तो मेरी प्रारंभिक उदाहरण बन जाएगा:

<cffunction name="HiddenisUsernameAvailable" access="private"> 
    <cfset logAccess(request.userid,Arguments.calledMethodName)> 
    ...... 
</cffunction> 

अब सभी कॉल्स onMissingMethod, जो तर्क है कि वास्तविक विधि के लिए पारित करने के लिए विधि नाम जोड़ देगा द्वारा रोक दिया जाएगा।

डाउनसाइड्स मैं इसे देखता हूं कि आत्मनिरीक्षण अब ठीक से काम नहीं करता है, और आपको अपने सभी कार्यों को कॉल करने के लिए नामांकित तर्कों का उपयोग करना होगा। यदि आप नामित तर्कों का उपयोग नहीं कर रहे हैं, तो तर्क यादृच्छिक रूप से missingMethodNameArguments संरचना में ऑर्डर बदल देंगे।

+0

रचनात्मक है कि! मैंने कभी एक फ़ंक्शन रैपर के बारे में सोचा नहीं। – ethyreal

संबंधित मुद्दे