【问题标题】:Global Variables in ColdFusionColdFusion 中的全局变量
【发布时间】:2015-08-21 01:49:00
【问题描述】:

2 个问题 -

在 CF8 中的 application.cfm 我冷设置了一个全局变量 像这样

<cfset DSN = "dej6_42">

我现在正在尝试适应 CF10/Lucee 中的 Application.cfc,但不知道如何设置相同的变量。

这是我当前的 Application.cfc

<cfcomponent output="false"> 

    <cfset This.name = "My Application"> 
    <cfset This.clientmanagement="True"> 
    <cfset This.loginstorage="Session"> 
    <cfset This.sessionmanagement="True"> 
    <cfset This.sessiontimeout="#createtimespan(0,0,10,0)#"> 
    <cfset This.applicationtimeout="#createtimespan(5,0,0,0)#">

    <cfset DSN = "dej6_42">
</cfcomponent>

我试过了

<cfset This.DSN = "dej6_42">

然后尝试在单独的页面中调用

<cfoutput>#Applicaton.DSN#</cfoutput>

我认为根据我的研究,我需要同时使用 application.cfc 和 application.cfm 来完成上述操作。 *edit - 我尝试在 application.cfc 文件的末尾添加一个 include 到 applciation.cfm,但它不起作用。

2 问题。 当我在 Application.cfc 中放置任何标准功能时,我的网站会变成空白页

这是 Application.cfc - 如果我删除 DSN 集下的所有内容,那么它将显示该站点。

<cfcomponent output="false"> 

    <cfset This.name = "My Application"> 
    <cfset This.clientmanagement="True"> 
    <cfset This.loginstorage="Session"> 
    <cfset This.sessionmanagement="True"> 
    <cfset This.sessiontimeout="#createtimespan(0,0,10,0)#"> 
    <cfset This.applicationtimeout="#createtimespan(5,0,0,0)#">

    <cfset DSN = "dej6_42">

    <cffunction name="onApplicationStart"> 

    </cffunction> 

    <cffunction name="onApplicationEnd"> 

    </cffunction> 


    <cffunction name="onRequestStart">  

    </cffunction> 

    <cffunction name="onRequest"> 

    </cffunction> 


    <cffunction name="onRequestEnd"> 

    </cffunction> 

    <cffunction name="onSessionStart"> 

    </cffunction> 

    <cffunction name="onSessionEnd"> 

    </cffunction> 

    <cffunction name="onError"> 

    </cffunction> 



</cfcomponent>

【问题讨论】:

  • 马特的回答是正确的。 CFC 有自己的变量范围,不与请求的其余部分共享。这是设计和理想的或封装的。另外,请注意“应用程序”范围绝不引用 Application.cfc 中任何范围内设置的任何变量。另外,请阅读 Application.cfc 上的文档,您正在使用空方法拦截您的请求。
  • 您可能想阅读一下:learncfinaweek.com/week1/Application_cfc,因为它解释了这些生命周期方法

标签: coldfusion coldfusion-10 railo application.cfc


【解决方案1】:

您的示例没有设置全局变量。它在变量范围内设置一个变量:任何基于 CFC 的代码或请求中使用的任何自定义标记都无法访问它。它仅在 Application.cfm、请求的文件、它包含的文件和 OnRequestEnd.cfm 中可用

Application.cfc 是一个 CFC(很明显),因此在其中设置的变量范围变量仅在其中可用。如果要设置应用程序范围的变量,则需要将其放在应用程序范围内。应用程序范围变量应该在 onApplicationStart) 处理程序中设置,该处理程序在应用程序启动时运行一次,但不是在每个请求上运行。作为比较,Application.cfm(名称错误)在每个请求上运行。它应该被称为 OnRequestStart.cfm。

为了清楚起见,在onApplicationStart 中设置应用程序范围的变量如下:

function onApplicationStart() {
    application.DSN = "dej6_42";
}

如果您使用 onRequest() 拦截器,并且在该 include 中最初请求的文件,则请求将在 Application.cfc 实例的上下文中运行,并且在 onRequest 中设置的变量将可用于其余的主线请求代码,很像您在 Application.cfm 中设置变量的方式。但是,从语义上讲,如果您的意思是一个变量在应用程序的整个生命周期中都存在(如 DSN),那么最好将其放在应用程序范围内。

从您的问题中可以得出的推论听起来,您的应用架构可能在 1990 年代萎靡不振。我认为您应该阅读有关使用框架(例如:FW/1ColdBox)的内容,以便以可维护和可扩展的方式更好地组织您的代码。

您还应该阅读Application.cfc(和method reference)。可能还有一般的 CFC:Using ColdFusion components-Developing guide

您可能还想考虑对编写 CFML 的方法进行现代化改造,并为视图代码保留标签,否则使用脚本。如果整个应用程序没有被标签弄得乱七八糟,它使您和其他可能最终需要维护代码的开发人员更容易理解代码。

【讨论】:

  • 我不确定我是否遵循您的意思 - 使您编写 CFML 的方法现代化并为视图代码保留标签,否则使用脚本。
  • 尼克斯最后的评论亚当。我重新读了你写的东西。是的,我同意,这只是对 Application.cfc 的尝试。我支持基于标签的系统,所以我很乐意使用它,我们使用 application.cfm- 这个 cfc 是一个不同的生物,但我不反对改变。在那种环境中更难,因为它的代码支持更多,然后是需要重写的重大更改。这无疑是一次冒险,因为开发人员喜欢硬编码而不是使用变量。
  • 一个 sn-p 会很好
  • 设置变量的例子?真的吗?好的,我会更新答案。完成。
【解决方案2】:

您需要将其设置到应用程序范围内

<cfcomponent output="false"> 
  <cfset This.name = "My Application"> 
  <cfset This.clientmanagement="True"> 
  <cfset This.loginstorage="Session"> 
  <cfset This.sessionmanagement="True"> 
  <cfset This.sessiontimeout="#createtimespan(0,0,10,0)#"> 
  <cfset This.applicationtimeout="#createtimespan(5,0,0,0)#">
  <cfset application.DSN = 'dej6_42'>
</cfcomponent>

【讨论】:

  • 我试过了,但我收到一条错误消息,指出 Element DSN 在应用程序中未定义。
  • 那是设置应用程序范围变量的错误位置。它应该在onApplicationStart()
猜你喜欢
  • 1970-01-01
  • 2012-04-15
  • 1970-01-01
  • 1970-01-01
  • 2019-04-04
  • 2013-10-06
  • 2012-06-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多