2012-05-11 35 views
5

Tôi gặp sự cố khi đặt ánh xạ trong Application.cfc Chúng tôi có Máy chủ phân kỳ (dev, QS, prod) Mỗi một đường dẫn khác nhau. Tôi muốn đặt đường dẫn và biến máy chủ cụ thể thông qua tệp cấu hình. Trên ApplicationStart bạn đọc tệp ini và thiết lập hệ thống của bạn. http://www.raymondcamden.com/index.cfm/2005/8/26/ColdFusion-101-Config-Files-AGoGo Tính năng này hoạt động tốt.Làm cách nào để đưa ánh xạ vào Application.cfc từ tệp thuộc tính bên ngoài?

Normaly bạn thiết lập ánh xạ trong Applcation.cfc như thế này:

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

Một nơi nào đó trong một cfm tập tin bình thường tôi instatiate một CFC tên thử nghiệm qua:

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

Tôi muốn thiết lập ánh xạ chỉ một lần tại 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> 

Nhưng điều này không làm việc vì các ánh xạ này trống và yêu cầu tiếp theo. :(

Đưa này để 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> 

tôi nhận được một lỗi mà các thành phần không thể tìm thấy. Đây là kỳ lạ.

Đưa struct vào phạm vi ứng dụng

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

Làm cách nào để gọi Thành phần của tôi?

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

Không hoạt động.

Vì vậy, tôi có 3 mục tiêu.

  1. đọc tất cả pathes và ánh xạ từ tập tin ini
  2. đọc chúng một lần tại ApplicationStart
  3. sử dụng dễ dàng trong sourcecode.

Trả lời

7

Các ánh xạ không thể được đặt trong onApplicationStart(), chúng phải được đặt trong hàm tạo giả của Application.cfc và chúng phải được đặt trên mọi yêu cầu. Cũng cần lưu ý rằng phạm vi ứng dụng không có sẵn tại thời điểm này, do đó nếu bạn cần lưu vào bộ nhớ cache bất cứ thứ gì bạn sẽ cần để sử dụng phạm vi máy chủ. Page 5 Bạn có thể cache cấu trúc ánh xạ của bạn đến phạm vi máy chủ và chỉ cần đặt nó vào trong ánh xạ này mỗi yêu cầu.

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

Nếu bạn có ý định để giữ cho bạn tập tin ini trong webroot, bạn nên làm cho nó một mẫu .cfm và bắt đầu nó với một cfabort <>. Nó sẽ hoạt động giống nhau nhưng sẽ không thể đọc được

ApplicationProperties.ini.cfm

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

Cảm ơn rất nhiều điều này đã mang đến cho tôi một bước tiến đúng đắn. Nhưng vì dòng này Tôi gặp lỗi "không tìm thấy" khi gọi một trang không có trong webroot. – inog

+0

Tôi không muốn mã hóa nó. Bất kỳ ý tưởng nào về tình trạng khó xử của gà hoặc trứng này? – inog

+0

Thats vì đường mở rộng gọi() của nó liên quan đến vị trí tệp hiện tại. Bạn sẽ phải sử dụng đường dẫn tuyệt đối, tôi đã cập nhật câu trả lời của mình để hiển thị số –

Các vấn đề liên quan