Global Variables in ColdFusion

烈酒焚心 提交于 2019-12-12 19:23:13

问题


2 Questions -

In CF8 in the application.cfm I cold set a global variable like so

<cfset DSN = "dej6_42">

I am now trying to adjust to the Application.cfc in CF10/Lucee and can not figure out how to set this same variable.

Here is my current 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>

I have tried

<cfset This.DSN = "dej6_42">

Then tried to call in a separate page

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

I think from my research I will need to use both application.cfc and application.cfm to accomplish the above. *edit - I tried to add an include at the end of the application.cfc file to applciation.cfm and it did not work.

2 Question. When I place any of the standard functions in the Application.cfc my site turns to a blank page

Here is that Application.cfc - I if I remove everything below the DSN set then it will display the site.

<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>

回答1:


Your example doesn't set a global variable. It sets a variable in the variables scope: it will not be accessible to any CFC-based code nor any custom tags used within the request. It'll only be available in the Application.cfm, the file requested, files it includes, and OnRequestEnd.cfm

Application.cfc is a CFC (to state the obvious), so variables-scoped variables set within it are only available within it. If you want to set an application-wide variable, you need to put it in the application scope. Application scope variables should be set in the onApplicationStart) handler which is run once when the application starts, but not on every request. By way of comparison Application.cfm (which is misnamed) is run on every request. It should be called OnRequestStart.cfm.

So to be clear, setting an application-scoped variable in onApplicationStart would be as thus:

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

If you use an onRequest() interceptor, and within that include the originally requested file, then the request will be run in the context of the Application.cfc instance, and variables set within onRequest will be available to the rest of the mainline request code, much like the way you set your variable in Application.cfm. Semantically though, if you mean a variable to exist for the life of the application (like a DSN), then putting it in the application scope is the best bet.

It sounds to me from the inferences one can make from your question that your app architecture might be languishing in the 1990s. I think you should read up on using a framework (eg: FW/1 or ColdBox) to better organise your code in a maintainable and scalable way.

Also you should read up on Application.cfc (and method reference). And probably CFCs in general: Using ColdFusion components-Developing guide.

You also might want to think about modernising your approach to writing CFML and spare the tags for view code, and otherwise using script. It makes the code easier to follow for both you and other developers who might end up needing to maintain it if the whole app isn't cluttered up with tags.




回答2:


You need to set it into the application scope

<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>


来源:https://stackoverflow.com/questions/32131130/global-variables-in-coldfusion

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!