关于在特定项目中需要相互交谈的CFC实例的正确方法,我有一个"最佳实践"问题.
比方说,您有一个Web应用程序,其中包含许多不同的模块:
这些模块中的每一个都组织得很好,以便与每个模块相关的功能包含在单独的CFC文件中:
每个CFC都包含适用于该特定模块的功能.例如,Users.cfc包含与开启/关闭用户,更新帐户信息等有关的功能......有时,CFC可能需要引用另一个CFC中的功能,例如,如果商店(Store.cfc)需要获取信息来自客户(Users.cfc).但是,我不确定实现这一目标的正确方法.我一直在玩几种方式让我的CFC互相引用:
方法1:在CFC中,例如您将需要的其他CFC:
<!--- Store.cfc --->
<cfcomponent>
<!--- instance all the CFC’s we will need here --->
<cfset usersCFC = CreateObject("component","users") />
<cfset filesCFC = CreateObject("component","files") />
<cffunction name="storeAction">
<cfset var customerInfo = usersCFC.getUser(1) />
Run Code Online (Sandbox Code Playgroud)
这种方法似乎大部分时间都有效,除非一些实例化的CFC也实例化了它们的CFC.例如:如果Users.cfc实例Files.cfc和Files.cfc也是Users.cfc实例.由于某种类型的无限递归问题,我偶尔会遇到可怕的NULL NULL错误.
方法2:在CFC的函数范围内实例化所需的CFC(这似乎可以防止递归问题):
<!--- Store.cfc --->
<cfcomponent>
<cffunction name="storeAction">
<!--- create a struct to keep all this function’s variables --->
<cfset var local = structNew() />
<!--- instance all the CFC’s we will …Run Code Online (Sandbox Code Playgroud) 我想在不同的目录中扩展一个CFC,我有几个选项,但无法弄清楚如何执行此操作:
A)使用动态映射(这必须是基于站点的动态,例如对于现场站点,它将是cfc.myPackage.MyCFC,但在开发站点上它将是myCfcRoot.myPackage.MyCFC) - 我试过将表达式放入extends位,但很明显CF不喜欢它,例如:
<cfcomponent name="MyComponent" extends="#config.cfcRoot#.BaseComponent">
Run Code Online (Sandbox Code Playgroud)
要么
<cfcomponent name="MyComponent" extends="#GetRealPath(../BaseComponent.cfc)#">
Run Code Online (Sandbox Code Playgroud)
B)提供CFC的相对路径(以某种方式)以进行扩展.
我担心我不能这样做,但我希望有一些我错过的东西.
我一直在建立一份要分享的CFC最佳实践清单.
那里有很多文章,但我认为在这里通过经验学到的任何技巧和提示可以在一起.
我会在这里添加一些链接以便它继续下去,但我认为最好的事情不是长篇文章可以用Google搜索.
更新:这已被制作成社区维基
我有一个CFC方法,我希望以30秒的间隔运行.但是,问题是ColdFusion不会让我安排以60秒或更短的间隔运行的任务.有没有人有关于我如何能够(并且应该)实现这一目标的建议?
为了先发制人地回答"当你的脚本运行时间超过30秒时会发生什么",或者任何其他类似的问题,我已经考虑了所有这些问题,这不是一个问题.
我在Windows Server 2003(IIS6)上运行ColdFusion 8.0.1(带有修补程序4).作为旁注,我使用Java 1.6u21作为ColdFusion的JVM.
提前致谢.
我认为CFC中定义为cfscript函数的方法默认是output = false,但是当我在cfcexplorer.cfc中打开CFC(浏览器直接到CFC)时,它表示输出:启用.
cfcexplorer.cfc的Bug?
有没有办法在标签中指定组件路径?
我正在为我的应用程序使用ColdFusion组件.我的应用程序有几个文件夹,每次我想要一个CFC工作时,我必须将它保存在与需要访问的文件相同的目录中.这导致我创建了几个相同的CFC文件.
有没有办法将我的CFC存储在一个目录中,并使其在我的网站上工作?
这是我第一次编写cfc,它将从外部Web服务器捕获JSON数据,这些数据将发布信息.
我正在使用一种新服务,可以设置为通过HTTP POST将我们发送到我指定的URL,以及有关失败事务的信息的JSON数据包.
我想我已经设置了一个具有远程访问权限的CFC来捕获和反序列化JSON数据,然后我们可以采取行动.但是,我无法弄清楚如何在CFC中设置函数来接收数据?
我将URL设置为www.mydomain.com/com/processRemote.cfc?method=catchJSONdata&ReturnFormat=json
为了测试它,我设置了一个应该发布会话数据的简单测试页面:
<cfhttp
result="result"
method="post"
url="http://www.mydomain.com/com/processRemote.cfc?method=catchJSONdata&ReturnFormat=json">
<cfhttpparam type="header" name="content-type" value="application/json"/>
<cfhttpparam type="body" value="#serializeJSON(session)#"/>
Run Code Online (Sandbox Code Playgroud)
那么我迷失的地方是我在我的cfc中最初存储JSON数据的cfargument名称是什么?我无法控制将发送JSON数据的远程服务.
谢谢,
例如,我希望能够以编程方式命中一行代码,如下所示,在不使用Evaluate()的情况下动态分配函数名称.下面的代码当然不起作用,但代表了我想做的事情.
application.obj[funcName](argumentCollection=params)
Run Code Online (Sandbox Code Playgroud)
我可以找到动态调用函数的唯一方法是使用cfinvoke,但据我所知,它实时实例化相关的cfc /函数,不能使用以前实例化的cfc.
谢谢
在Coldfusion组件/ CFC中,我想正确地将一些变量的范围限定为可用于所有包含的函数,但是要隐藏或阻止外部脚本.cfc的内存范围是什么名字?这是'变量'吗?是否在包含的函数内可用?它是否被阻止在cfc之外?
(CF 8中的例子)
致电页面:
<cfset settings = structNew()>
<cfset util = createObject("component", "myUtils").init(settings)>
<cfoutput>
#util.myFunction()#
</cfoutput>
Run Code Online (Sandbox Code Playgroud)
myUtils.cfc:
<cfcomponent>
<!--- Need to set some cfc global vars here --->
<cffunction name="init" access="public">
<cfargument name="settings" type="struct" required="no">
<!--- I need to merge arguments.settings to the cfc global vars here --->
<cfreturn this>
</cffunction>
<cffunction name="myFunction" access="public">
<cfset var result = "">
<!--- I need to access the cfc global vars here for init settings --->
<cfreturn result>
</cffunction>
</cfcomponent>
Run Code Online (Sandbox Code Playgroud)
欢迎提供其他最佳实践建议.我做完这件事已经有一段时间了.提前致谢.
我有一个函数将字符串转换为数字
<cffunction name="convertToNumber" returntype="numeric">
<cfargument name="separator" required="Yes" type="string" />
<cfargument name="number" required="Yes" type="string" />
<cfset LOCAL.arrSeparator = ["comma", "period", "lakh_crore"] />
<cfif ARGUMENTS.separator eq "comma" or ARGUMENTS.separator eq "lakh_crore">
<cfif ListLen(ARGUMENTS.number, ".") eq 2>
<cfset LOCAL.integral = ListFirst(ARGUMENTS.number, ".") />
<cfset LOCAL.fractional = ListLast(ARGUMENTS.number, ".") />
<cfelse>
<cfset LOCAL.integral = ARGUMENTS.number />
<cfset LOCAL.fractional = "" />
</cfif>
<cfset LOCAL.integral = Replace(LOCAL.integral, ",", "", "ALL") />
<cfset LOCAL.returnValue = LOCAL.integral />
<cfif Len(Trim(LOCAL.fractional))>
<cfset LOCAL.returnValue &= "." & LOCAL.fractional /> …Run Code Online (Sandbox Code Playgroud)