2

我只是想在 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>
.
.
.

还是有更好的东西?

4

4 回答 4

2

存储站点特定配置数据的最佳方法可能是创建一个名为SiteConfig.cfc的新组件,并使用诸如getProperty(propertyName)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>

应用程序.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>

测试.cfm

<cfset propertyValue = application.getProperty("siteName") />
<cfdump var="#propertyValue#" />
于 2010-03-15T21:40:08.967 回答
2

默认情况下,GetProperty 将在变量范围内可见,这对于许多用途(在 .cfm 模板中)来说已经足够了。

如果你想直接在组件中使用这些方法,在 Application 范围内引用它们就可以了。

尽管我在 onRequestStart() 中使用 Request 范围来执行此操作,但这只是我个人的偏好。像这样的东西:

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

请注意,一般的最佳实践是封装对象并在宿主对象的变量范围内引用它们。我通常在初始化对象时这样做,只需将先前创建的对象作为 init() 参数传递。

PS 现在推荐使用小写的标签和它们的属性。一种良好的编码实践。

于 2010-03-15T18:27:04.267 回答
0

您可能还想使用这里讨论的技术

于 2010-03-16T20:30:39.410 回答
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() 函数将起作用

于 2010-03-15T18:39:23.087 回答