2010-03-15 77 views
2

我只是想在application.cfc中定义一个函数,并将它暴露给所有请求的应用程序。优选地,“分配”仅在应用程序启动时发生。什么是将一般udf分配给application.cfc的正确方法?

是一起做的这个东西线的首选方法:

<CFCOMPONENT OUTPUT="FALSE"> 
<CFSET this.name = "Website"> 
<CFSET this.clientManagement = true> 
<CFSET this.SessionManagement = true> 

<CFFUNCTION NAME="GetProperty" OUTPUT="False"> 
    <CFARGUMENT NAME="Property"> 

    <CFRETURN this.Props[Property]> 
</CFFUNCTION> 

<CFFUNCTION NAME="OnApplicationStart" OUTPUT="FALSE"> 
    <CFSET Application.GetProperty = GetProperty> 
. 
. 
. 

或者是有什么好?

回答

2

存储站点特定的配置数据的最佳方式很可能将是创建一个新的组件命名的东西,例如SiteConfig .cfc使用方法如getProperty(propertyName)setProperty(propertyName,value)。这样,你会做存储这个CFC的应用范围的Application.cfc的onApplicationStart方法里面如下所示:

<cfset application.siteConfig = createObject("component", "SiteConfig").init() /> 

回到你原来的问题,虽然关于应用范围存储UDF,下面是一个办法做到那。基础是,在onApplicationStart您将创建一个新的应用程序持久化结构与您的网站的配置属性,如siteName和其他任何。然后一个函数被存储在CFM文件中,该文件仅包含在onApplicationStart中,然后被复制到应用程序范围中。这意味着您的所有常规页面CFM文件都可以使用application.getProperty(propertyName)。 由于该函数只创建一次并存储在应用程序范围内,因此它满足了原始问题关于“仅在应用程序启动时才会进行分配”的要求。

希望这会有所帮助!

getProperty.function.cfm

<cffunction name="getProperty" output="false"> 
    <cfargument name="propertyName" type="string" required="true" /> 
    <cfreturn application.config[propertyName] /> 
</cffunction> 

的Application.cfc

<cffunction name="onApplicationStart" output="false"> 
<cfset application.config = structNew() /> 
<cfset application.config.siteName = "My App's Display Name" /> 
<cfinclude template="getProperty.function.cfm" /> 
<cfset application.getProperty = variables.getProperty /> 
</cffunction> 

test.cfm

<cfset propertyValue = application.getProperty("siteName") /> 
<cfdump var="#propertyValue#" /> 
+0

谢谢Greg。从本质上讲,它是一个代码库,它将运行多个网站并根据URL进行更改。所以一个特定的网站会有自己特有的信息(例如网站名称)。 – 2010-03-15 22:04:45

+0

感谢您的额外信息汤姆。我已经更新了上面的答案。不确定从单个代码库管理多个站点的最佳方式,但希望这可以帮助您顺其自然。 – sqrl0 2010-03-15 22:53:33

+0

谢谢Greg。这很好,它回答了这个问题,并给出了一个更好的方法来做到这一点。 – 2010-03-16 09:52:15

2

默认情况下,GetProperty将在Variables作用域中可见,这对于很多用法(在.cfm模板中)都是足够的。

如果您想在组件中直接使用这些方法,那么在Application范围中引用它们就没问题。

尽管我在onRequestStart()中的Request范围内执行此操作,但这只是我个人的偏好。事情是这样的:

request.udf = {}; 
request.udf.halt = halt; 

请注意,一般是incapsulating的对象,并让他们在主机对象的变量的作用域引用了最佳实践。我通常在初始化对象时执行此操作,只需将先前创建的对象作为init()参数传递即可。

P.S.如今,建议使用小写字母来表示标签及其属性。很好的编码习惯。

+0

我们使用onRequestStart它,我相信,不会自动把函数的变量范围。 – 2010-03-15 19:51:47

+0

如果你的意思是我的第一句话,CF默认是这样做的,因为你已经在Application.cfc – Sergii 2010-03-15 20:14:33

+0

中创建了这个方法。这个链接解释我在说什么。从本质上说,如果使用onRequest方法,调用cfm将只具有变量范围中的函数,因为它使用cfinclude:http://www.bennadel.com/blog/805-ColdFUsion-Application-cfc-OnRequest-Creates-A-组件-Mixin.htm – 2010-03-15 20:36:12

0

你可能会考虑在服务器范围内创建一个单独的“属性” CFC和instanciating它作为 单身那么将可从任何CFML页面甚至 如果它不是一个应用程序的一部分。如果你走这条路线,那么没有“server start”事件绑定到。相反,你可以把这个中的Application.cfc 的构造器或在application.cfm

<cfif not structkeyexists(server,"properties")> 
     <cflock name ="loadProperties" 
      timeout ="10" 
      type ="exclusive" 
     > 
      <cfif not structkeyexists(server,"properties")> 

       <cfset server.properties = 
        createObject("component","path-to-props.cfc") 
        .init({..inital properties..}) 
       > 
      </cfif> 
     </cflock> 
    </cfif> 

锁码的身体是为了防止创建和每个 请求分配UDF的开销。这也使得性能实例坚持以使具有 properties.SetProperty()函数将工作

0

您可能还WA NT使用的技术讨论here

相关问题