我如何可以包括从外部属性文件映射到的Application.cfc?(How can I inclu

2019-07-29 08:44发布

我有在的Application.cfc设置映射麻烦我们有diverent服务器(DEV,QS,PROD)各少许不同Pathes。 我想通过配置文件来设置服务器而pathes和变量。 在ApplicationStart你读的ini文件和设置您的系统。 http://www.raymondcamden.com/index.cfm/2005/8/26/ColdFusion-101-Config-Files-AGoGo这工作得很好。

Normaly你Applcation.cfc设置映射是这样的:

<!--- in Application.cfc --->
<cfset this.mappings['/components'] = "D:\Inetpub\wwwroot\myApp\components">

某处在一个正常的CFM文件我通过instatiate一个CFC名为test:

<cfset t = createObject("component", "components.test")>

我想设置的映射唯一一次onApplicationsStart

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

    <!---create structure to hold configuration settings--->
    <cfset ini = structNew()>
    <cfset ini.iniFile = expandPath("./ApplicationProperties.ini")>
    <cfset application.ini = ini>

    <!--- read ini file --->
    <cfset sections = getProfileSections(application.ini.iniFile)>

    <cfloop index="key" list="#sections.mappings#">
       <cfset this.mappings[key] = getProfileString(application.ini.iniFile, "mappings", key)>
    </cfloop>

但是,这并不工作,因为this.mappings是空的,下一个请求。 :(

把这个给OnRequestStart

<!--- read ini file --->
    <cfset sections = getProfileSections(application.ini.iniFile)>

    <cfloop index="key" list="#sections.mappings#">
       <cfset this.mappings[key] = getProfileString(application.ini.iniFile, "mappings", key)>
    </cfloop>

我得到的组件不能被发现的错误。 这很奇怪。

把结构到应用范围

    <cfloop index="key" list="#sections.mappings#">
       <cfset APPLICATION.mappings[key] = getProfileString(application.ini.iniFile, "mappings", key)>
    </cfloop>

如何调用我的组件?

<cfset t = createObject("component", "application.components.test")>

不工作。

因此,我有3个目标。

  1. 阅读从ini文件所有pathes和映射
  2. 在ApplicationStart阅读他们一次
  3. 使用方便的源代码。

Answer 1:

映射不能onApplicationStart设置(),他们必须在的Application.cfc的伪构造函数中设置,并且必须在每次请求进行设置。

同样重要的是要注意,应用范围不可用在这一点上,因此,如果您需要缓存什么,你就需要使用服务器范围。 您可以缓存你的映射结构的服务器范围,只是设置成this.mappings每个请求。

<cfcomponent>
  <cfset this.name = "myapp" />

  <!--- not cached so create mappings --->
  <cfif NOT structKeyExists(server, "#this.name#_mappings")>
    <cfset iniFile = getDirectoryFromPath(getCurrentTemplatePath()) & "/ApplicationProperties.ini" />
    <cfset sections = getProfileSections(iniFile) />
    <cfset mappings = structnew() />
    <cfloop index="key" list="#sections.mappings#">
      <cfset mappings[key] = getProfileString(iniFile, "mappings", key)>
    </cfloop>
    <cfset server["#this.name#_mappings"] = mappings />
  </cfif>

  <!--- assign mappings from cached struct in server scope --->
  <cfset this.mappings = server["#this.name#_mappings"] />

  <cffunction name="onApplicationStart">
  <!--- other stuff here --->
  </cffunction>

</cfcomponent>

如果您打算让您在根目录ini文件,你应该让一个.CFM模板,并用<cfabort>启动它。 它的作用相同,但将无法读取

ApplicationProperties.ini.cfm

<cfabort>
[mappings]
/foo=c:/bar/foo


文章来源: How can I include mappings into Application.cfc from external property file?