2010-06-09 18 views
6

Tôi đang di chuyển một ứng dụng cũ sử dụng application.cfm để sử dụng application.cfc. Các CFM đặt ra một vài globals nhưCó thể tạo một toàn cầu chưa được quét trong application.cfc không?

<cfset dsn = "myDSN"> 

Tôi đã thử đặt rằng dòng mã trong onApplicationStart, onRequestStart, vv nhưng cố gắng để in giá trị ra trong một trang kết quả thử nghiệm bên trong lỗi. Việc đặt giá trị trong phạm vi ứng dụng (ví dụ: application.dsn) hoạt động tốt, nhưng tôi đang trong thời hạn chặt chẽ và không thể đạp thuyền bằng cách thực hiện tìm kiếm trên toàn trang web và thay thế cho toàn cầu.

Tôi biết việc đưa những điều này vào phạm vi là điều đúng đắn cần làm, nhưng hiện tại, có cách nào để chuyển sang sử dụng Application.CFC nhưng vẫn tạo các biến toàn cầu chưa được dò tìm?

Trả lời

9

Hãy thử đặt bên trong onRequest() thay vì onRequestStart().

+0

Điều đó đã thực hiện thủ thuật mặc dù tôi đã bỏ phiếu cho câu trả lời dưới đây cũng vì điều đó cũng tốt trong tương lai. – DaveBurns

4

Bạn sẽ cần cả Application.cfc và Application.cfm. Di chuyển tất cả các mã chính từ Application.cfm đến các phần thích hợp của Applicaiton.cfc.

Sau đó, và điều này có thể là dòng duy nhất, trong Applicaiton.cfm:

<cfset variables.dsn = "myDSN" />

Bây giờ quay trở lại Application.cfc và thêm bên ngoài này của tất cả các chức năng:

<cfinclude template="Application.cfm" />

Trên test.cfm của bạn, bây giờ sẽ có thể xuất ra biến dsn không có tiền tố phạm vi:

<cfoutput>#dsn#</cfoutput>

Nếu bạn xác định biến.dsn ở bất kỳ đâu trong CFC, bạn đặt biến vào phạm vi biến của CFC, là riêng tư cho CFC. Bằng cách xác định nó trong CFM, sau đó bao gồm CFM, nó được giữ trong phạm vi biến của yêu cầu trang.

+2

Nếu bạn sử dụng phương pháp này, tôi muốn đặt tên cho tệp được bao gồm như globals.cfm, để tránh bất kỳ sự nhầm lẫn nào về việc liệu nó có được xử lý như Application.cfm trong các phiên bản trước của CF (không phải là nó). –

+0

Có ai thử nghiệm cách tiếp cận thú vị này không? Có lẽ tôi đang làm một cái gì đó sai trái với 3 mẫu một dòng của tôi, nhưng nó không làm việc cho tôi (CF9). Đã thử application.cfm và globals.cfm. Và thành thật mà nói, tôi đã không mong đợi nó hoạt động, bởi vì tôi không thấy, tại sao thiết lập một biến trong một tệp được bao gồm nên "rời" phạm vi của cfc bao gồm và làm cho biến toàn cục có sẵn. Và tại sao trực tiếp thiết lập var trong application.cfc bên ngoài các hàm không nên làm việc theo cùng một cách. Phương thức onRequest() "Mixin" hoạt động như mong đợi. –

+0

Tôi cũng đã thử điều này trên CF9, cập nhật 1 với kết quả âm. –

1

Tự đấu vật với bản thân mình, tôi sẽ cung cấp cho bạn giải pháp của tôi. Lưu ý rằng điều này làm việc trên CF9, tôi không biết về các phiên bản khác (có một vấn đề với các cuộc gọi onRequest và AJAX trong các phiên bản trước). Về cơ bản, nó cần thiết để có hàm onRequest trong Application.cfc của bạn. Dưới đây là mẫu cơ bản:

<cffunction name="onRequest" access="public" returntype="void" output="true"> 
    <cfargument name="targetPage" type="string" required="true"> 

    <!--- include the requested page. ---> 
    <cfinclude template="#arguments.TargetPage#"> 
</cffunction> 

As far as I understand it: it's actually the cfinclude that enables you to access the functions. So, with this onRequest in your Application.cfc you can access the 'this' scope of the Application.cfc which would include your public functions & variables. 
If you want a more in depth example of this then check out Framework-1 by Sean Corfield. It does this exact thing, all API methods are contained in the Application.cfc. 
Các vấn đề liên quan