Вопрос по – Как я могу включить сопоставления в Application.cfc из внешнего файла свойств?

5

У меня проблемы с настройкой сопоставлений в Application.cfc У нас есть другой сервер (dev, QS, prod) У каждого немного разные пути. Я хочу установить серверные пути и переменные через файл конфигурации. На ApplicationStart вы читаете INI-файл и настраиваете свою систему. http://www.raymondcamden.com/index.cfm/2005/8/26/ColdFusion-101-Config-Files-AGoGo Это отлично работает.

Обычно вы устанавливаете сопоставления в Applcation.cfc следующим образом:

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

Где-то в обычном файле cfm я устанавливаю cfc с именем test через:

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

Я хочу установить сопоставления только один раз вonApplicationsStart

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

Но это не работает, потому что this.mappings пусто и следующий запрос. :(

Поместить это в OnRequestStart

<code><!--- 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>
</code>

Я получаю сообщение об ошибке, что компонент не может быть найден. Это странно.

Putting the struct into Application scope

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

Как позвонить в мой компонент?

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

Не работает.

Итак, у меня есть 3 цели.

reading all pathes and mappings from ini file reading them once at ApplicationStart easy usage in sourcecode.

Ваш Ответ

1   ответ
7

Сопоставления не могут быть установлены в 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 и начать его с & lt; cfabort & gt ;. Это будет работать точно так же, но не будет читабельным

ApplicationProperties.ini.cfm

<cfabort>
[mappings]
/foo=c:/bar/foo
Error: User Rate Limit Exceeded inog
Error: User Rate Limit ExceedednotError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded inog
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded inog

Похожие вопросы