我只是想在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>
.
.
.
还是有更好的东西?
答案 0 :(得分:2)
默认情况下,GetProperty已经在Variables范围内可见,这对于许多用法来说已经足够了(在.cfm模板中)。
如果要直接在组件中使用这些方法,可以在Application范围中引用它们。
虽然我在onRequestStart()中使用Request范围执行此操作,但这只是我个人的偏好。像这样:
request.udf = {};
request.udf.halt = halt;
请注意,一般的最佳做法是封装对象并在宿主对象的变量范围内引用它们。我通常在初始化对象时执行此操作,只需将先前创建的对象作为init()参数传递。
P.S。现在建议使用小写标签及其属性。一种良好的编码实践。
答案 1 :(得分:2)
存储特定于站点的配置数据的最佳方法可能是使用 getProperty(propertyName) SiteConfig.cfc 的新组件>和 setProperty(propertyName,value)。然后,您可以通过在Application.cfc的onApplicationStart方法中执行以下操作,将此CFC存储在应用程序范围中,如:
<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#" />
答案 2 :(得分:0)
您可以考虑创建一个单独的“属性”CFC并将其实例化为 在SERVER范围内的单例,它甚至可以从任何CFML页面获得 如果它不是申请的一部分。如果你走这条路,那就没有“服务器 启动“要绑定的事件。相反,您可以将它放在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()函数将起作用
答案 3 :(得分:0)
您可能还想使用所讨论的技术here