【问题标题】:Unable to access variables when converting from application.cfm to application.cfc从 application.cfm 转换为 application.cfc 时无法访问变量
【发布时间】:2012-04-14 11:26:13
【问题描述】:

我正在尝试将我支持的应用程序从 application.cfm 转换为 application.cfc。我关注了 Ben Nadel 的 ColdFusion Application.cfc Tutorial And Application.cfc Reference,但我的页面无法访问 APPLICATION 范围内的任何变量,除非将 APPLICATION. 添加到变量中。附带说明一下,此应用程序当前使用 0 个 cfc。

这是我的 application.cfc。

<cfcomponent displayname="Application" hint="Handle the application" output="true">

    <cfset THIS.Name = "AAS" />
    <cfset THIS.ApplicationTimeout = CreateTimeSpan( 0, 60, 0 , 0) />
    <cfset THIS.SessionManagement = true />
    <cfset THIS.setClientCookies = false />
    <cfset THIS.versionNum = '1'>
    <cfset THIS.genericUserID = 'o005265'>
    <cfset THIS.genericPassword = 'zo005265'>

    <cffunction 
        name="OnApplicationStart" 
        hint="Fires when the application is first created." 
        access="public" 
        output="false" 
        returntype="boolean">

       <cfset APPLICATION.aasURL = 'http://127.0.0.1:8500/aaas'>
       <cfset APPLICATION.dsn = 've0_aaas'>
       <cfset APPLICATION.aas_system = 'development (studio)'>

    <cfreturn true />
  </cffunction>
</cfcomponent>

基本上,我只是复制了 application.cfm 页面中的内容,并认为它的工作方式相同。我猜我必须在某个地方调用它?这是我唯一能想到的。任何帮助都会很棒。

--- 编辑 ---

我在@EvikJames 回答后添加了 OnRequest 和 OnApplicationStart 方法

<cffunction name="OnApplicationStart" access="public" returntype="boolean" output="false" hint="Fires when the application is first created.">
    <!--- Return out. --->
    <cfset APPLICATION.aasURL = 'http://127.0.0.1:8500/aaas'>
    <cfset APPLICATION.datasource = 've0_aaas'>
    <cfset APPLICATION.aas_system = 'development (studio)'>
    <cfreturn true />
</cffunction>


<cffunction name="OnRequest" access="public" returntype="void" output="true" hint="Fires after pre page processing is complete.">
    <!--- Define arguments. --->
    <cfargument name="TargetPage" type="string" required="true">
    <!--- Include the requested page. --->
    <cfinclude template="#ARGUMENTS.TargetPage#" />

    <cfset VARIABLES.dsn = APPLICATION.dsn>
    <cfset VARIABLES.aasURL = APPLICATION.aasURL>
    <cfset VARIABLES.aas_system = APPLICATION.aas_system>
    <!--- Return out. --->
    <cfreturn />
</cffunction>

【问题讨论】:

    标签: coldfusion application.cfc


    【解决方案1】:

    听起来您最初并没有使用应用程序范围的变量。如果变量最初不在“应用程序”的范围内。然后它们只是在“变量范围”(我知道的令人困惑的措辞)中,可以通过 cfm 页面命中和其他内容访问。这是在 application.cfm 和 application.cfc 之间移动时的一大变化。这里的总体思路遵循包含 CFM 文件共享变量范围而 CFC 文件不共享的原则。

    如果您要做的唯一更改是将#dsn# 更改为#appplication.dsn#,那么只需执行此操作并完成它。有诸如 WinGrep 甚至 Notepad++ 之类的工具可以跨多个文件进行查找和替换。

    【讨论】:

    • 看来 Application.cfc 和/或 OnRequestStart 不遵循这些约定。向 Evik +1 获取该信息。
    【解决方案2】:

    在您的 onApplication 启动方法中,执行以下操作:

    <cfset APPLICATION.datasource = 'MyDSN'>
    

    在您的 onRequest 方法中,执行以下操作:

    <cfset VARIABLES.DSN = APPLICATION.datasource>
    

    然后,此查询将起作用:

    <cfquery datasource="#dsn#">
    // sql
    </cfquery>
    

    我应该补充一点,当你完全升级后,你可以删除上面的所有代码,只需设置默认数据源:

    <cfset THIS.datasource = 'MyDSN'>
    

    【讨论】:

    • 这样做除了重复工作没有任何作用。使用原始值使用其中一个或另一个...为什么将它们永久存储在应用程序范围内,如果您想要的话,只需将它们设置在变量范围内?
    • @MarkAKruger,我认为您的意思是设置 毫无意义,对吗?我认为原始发布者正在寻找短期解决方案以及迁移计划。由于 DSN 通常设置在 APPLICATION 范围内,因此将其迁移到那里可能是个好主意。将代码迁移到使用默认数据源也是如此。无论哪种方式,一些想法的组合都会完成工作。
    • 啊...非常正确。一种中间步骤。好的,我买了它:)
    • 谢谢大家。两种解决方案都有效,是的@EvikJames我正在寻找一个短期解决方案和一个前进的计划。我可以给你们两个打勾来回答吗? :)
    • 把它交给 Evik - 我只是来服务的 :)
    【解决方案3】:

    您并没有真正尝试使用“应用程序”变量(总是需要限定范围)。我怀疑你的旧 application.cfm 页面有类似的东西。

    <cfapplicatin name="blah"...>
    
    <cfset dsn = 'mydsn'/>
    

    然后你可以做到:

    <cfquery datasource="#dsn#">
    

    这种方法不利用应用程序范围 ...它只是利用了你的application.cfm无论如何都会运行的事实。它实际上所做的是将变量放在 variables 范围内。因为 CF 总是首先检查“变量”范围,所以像 #dsn# 这样的东西可以工作 - 但这与应用程序范围不同。

    要在 Application.cfc 中模拟这种行为(如建议的那样),您需要将变量放在“onRequest()”函数中,而不是“onApplicationstart()”函数中 - 如下所示:

    <cffunction name="onRequest">
    <cfset dsn = 'mydsn'/>
    </cffunction>
    

    【讨论】:

    • 上面的 onrequest 函数不包含参数...但通常它会...我只是在演示...
    • Mark 的答案是正确的,可以避免更改遗留代码。理想情况下,Sam 的回答代表了最佳实践,但事情并不总是理想的。
    【解决方案4】:

    如果变量在应用程序范围内,您将始终需要在 .cfm 页面中以这种方式标识它。如果您使用没有范围前缀的变量名,则不会查看应用程序范围。

    如果您想在 application.cfc 中声明可以在其他页面中不受应用程序范围访问的变量,只需在任何函数之外声明变量即可。

    <component>
       <cfset this.name = "applicationName">
       <cfset otherVar = 'something'>
       <cfset otherVar2 = 'something else'>
    
       <cffunction name="onApplicationStart>.....</cffunction>
    </component>
    

    otherVar 和 otherVar2 可以在所有 .cfm 页面上调用而无需范围前缀。

    【讨论】:

      【解决方案5】:

      这是意料之中的。要引用应用程序变量,您需要在它们前面加上 application。

      【讨论】:

      • 所以,每次我想使用&lt;cfquery datasource="#dsn#"&gt;,我都得把代码全部改成&lt;cfquery datasource="#application.dsn#"&gt;?这似乎不对。我将不得不使用cfquery 标记的每个页面。我之前在使用 application.cfm 时不必这样做的原因是 application.cfm 在每个页面请求上运行?
      • 如果您使用的是 CF9,您可以设置默认数据源,如下所示: 您将不再需要使用此:datasource="#dsn#"
      • @EvikJames,我刚刚发现我们的测试服务器正在运行 CF9,但尚未升级到生产。但是我已经看到,在 CF9 中,cfquery 标记中不再需要数据源。
      • @EvikJames 从cfquery 标签中取出datasource 有效,但这仍然不能解决我必须更改每个页面的问题,使用旧的cfquery 标签包括数据源参数。
      • 那么,您正在尝试在所有现有查询中使用#DSN#,而不必对其进行限定,对吧?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-08
      • 1970-01-01
      • 2018-05-06
      • 2015-09-25
      • 2022-01-10
      相关资源
      最近更新 更多