2012-05-11 17 views
5

Mam problem z ustawianiem odwzorowań w Application.cfc Mamy serwer diverent (dev, QS, prod) Każdy z nieco innym Pathes. Chcę ustawić patsy i zmienne specyficzne dla serwera poprzez plik konfiguracyjny. Na ApplicationStart czytasz plik ini i konfigurujesz system. http://www.raymondcamden.com/index.cfm/2005/8/26/ColdFusion-101-Config-Files-AGoGo To działa dobrze.Jak dołączyć odwzorowania do Application.cfc z zewnętrznego pliku właściwości?

Normaly ustawienie mapowania w Applcation.cfc tak:

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

gdzieś w normalnym cfm pliku I instatiate CFC nazwie testu poprzez:

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

Chcę ustawić tylko mapowania raz na 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> 

Ale to nie działa, ponieważ to odwzorowanie jest puste i następne żądanie. :(

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

pojawia się błąd, że komponent nie można znaleźć. To jest dziwne.

Umieszczenie struct w zakresie aplikacji

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

Jak połączyć się z moim komponentem?

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

Nie działa.

Mam więc 3 cele.

  1. przeczytaniu wszystkich Ścieżki edukacyjne i mapowania z pliku ini
  2. je czytać raz na ApplicationStart
  3. łatwe zastosowanie w źródłowego.

Odpowiedz

7

Mapowania nie można ustawić w onApplicationStart(), muszą one być ustawione w pseudo konstruktorze Application.cfc i muszą być ustawione przy każdym żądaniu.

Należy również pamiętać, że zakres zastosowania nie jest dostępny w tym momencie, dlatego jeśli musisz cache cokolwiek, musisz użyć zakresu serwera. Możesz buforować strukturę mapowania do zasięgu serwera i po prostu ustawić ją w tym odwzorowaniu każdego żądania.

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

Jeśli zamierzasz trzymać Cię w pliku ini webroot, należy zrobić to szablon .cfm i uruchomić go z < cfabort>. Będzie działać tak samo, ale nie będzie można go odczytać:

ApplicationProperties.ini.cfm

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

Dziękuję bardzo za duży krok w dobrym kierunku. Ale z powodu tego wiersza Otrzymuję komunikat "Nie znaleziono błędu" podczas wywoływania strony, która nie znajduje się w katalogu webroot. – inog

+0

Nie chcę tego zakodować. Każdy pomysł na ten dylemat z kurczaka lub jajka? – inog

+0

To dlatego, że wywołuje metodę expandpath() względem aktualnej lokalizacji pliku. Będziesz musiał użyć bezwzględnej ścieżki, zaktualizowałem moją odpowiedź, aby pokazać to –

Powiązane problemy