2011-09-07 3 views
1

함수에서 "변수 POPUP이 정의되지 않았습니다."라는 오류가 나타납니다. 라이브러리는 onRequestStart 메소드의 첫 번째 부분으로 Application.cfc에 포함됩니다.ColdFusion에서 사용자 정의 함수를 사용할 수 없습니다 나는 내가 액세스하려고하면. 거기에 몇 가지 기능이 ColdFusion에서 9</p> <p>나는 UDF 라이브러리 (UDF_Library.cfm)를 포함하고를 사용하고

다음
<cfscript> 
// INCLUDE UDF_LIBRARY 
include "/UDF/UDF_Library.cfm"; 
</cfscript>   

라이브러리의 내용입니다 :

<cfscript> 
function popUp() { 
    return "AAAAAAAAAAAAAAAAAAAAAAAAAAAAA"; 
} 
</cfscript>   

나는 기능이 작동 알고 여기

내가 라이브러리를 포함 방법입니다. 방금 함수를 파일에 직접 작성하고 함수를 호출하면 올바르게 작동합니다.

<cfscript> 
writeOutput(popUp()); 
function popUp() { 
    return "AAAAAAAAAAAAAAAAAAAAAAAAAAAAA"; 
} 
</cfscript>   

페이지의 일부가로드되기 전에 application.cfc 파일의 UDF에 포함될 때 기능이 보이지 않는 이유는 무엇입니까?

답변

5

모든 안내에서 누락 된 정보는 변수 범위 지정이 작동하는 방식을 이해하기위한 제안이며 Application.cfc 이벤트 처리기가 함수를 선언 할 수있는 것과 아무 관련이 없다고 생각합니다.

Application.cfc 이벤트 처리기는 처음에 선언 된 항목에 마술 지속성을 부여하지 않습니다. 선언 된 변수 나 함수를 액세스 방법에 적합한 범위에 넣어 둘 필요가 있습니다. onRequestStart (또는 onRequest) 내에서 변수를 선언한다고해서 마술처럼 그 변수를 요청의 모든 항목에서 사용할 수있는 것은 아닙니다. 그리고 함수는 변수 일뿐입니다.

하나의 파일을 포함하는 경우 - 모든 변수 선언 (따라서 함수 선언)은 입력 범위에 관계없이 존재합니다. 함수를 선언하고 더 이상 아무것도하지 않으면 함수가 존재합니다 변수 범위에서만

모든 요청의 시작 부분에 만들어지는 Application.cfc 인스턴스 내의 메소드 인 onRequestStart()에서 함수를 선언하는 경우 해당 함수는 해당 CFC 인스턴스의 변수 범위에 저장됩니다 . 그리고 그 CFC 인스턴스의 수명만큼 오래 지속될 것입니다. onRequestStart()의 실행과 관련하여 CFC 인스턴스는 onRequestStart()를 실행하는 동안 지속됩니다. 그리 길지 않습니다. 한편

는 onRequest()는 (onRequestStart 같은()이다) 이벤트 핸들러는 이벤트 인터셉터입니다되지 않습니다 : 그것은 대신이 차단 이벤트의 일어난다. 일반적으로 onRequest()는 - 문자 그대로 - 요청되는 템플릿을 포함합니다. 따라서 요청 된 템플릿은 onRequest()를 통해 CFC 인스턴스와 동일한 메모리 공간에서 실행되므로 포함 된 템플릿은 CFC 인스턴스의 변수 범위를 공유하므로 변수 범위가 onRequest()로 제공됩니다. 따라서 onRequest()가 변수 범위에서 많은 함수를 선언하는 UDF 라이브러리를 포함하면 ... onRequest() 인터셉터에 포함 된 주 요청 파일과 동일한 변수 범위입니다. 파일을 포함한 다른 CFC 인스턴스 메소드와 동일합니다.

그래서 ... onRootStart()에서 함수로 가득 찬 파일을 포함시키는 것만으로도 원하는대로 수행 할 수 있습니다. OnRequest()에서 함수로 가득 찬 파일을 동등하게 포함하면 마법의 지속성이 부여되지 않고 변수 범위에만 들어갑니다. 즉, 요청한 템플리트와 템플리트에 포함 된 모든 템플리트에 액세스 할 수 있습니다. 요청에 사용 된 CFC 인스턴스가 아닌 사용자 정의 태그에서 사용할 수 없습니다.

요청 내에서 모든 코드에서 기능 (또는 "일부 기능")을 사용하려면 해당 기능을 요청 범위 (또는 다른 공유 범위)에 넣어야합니다. 이렇게하는 방법은 변수와 동일합니다 :

request.something = somethingElse; 

그게 전부입니다. 그게 유일한 방법입니다. 기능이 가득 찬 파일을 포함시키는 것은 포함 방법에 상관없이 원하는 것을위한 완벽한 솔루션이되지 못합니다.

+0

당신은 단지 어둠이있는 곳에 명확성을 제공했습니다. –

2

나는 보편적으로 사용할 수있는 함수가 onRequestStart()가 아니라 onRequest()에 포함되어야한다고 생각합니다.

+0

제이슨의 말이 맞습니다. UDF는 각 메소드의 지역 변수 인'variables' 범위에 놓입니다. 따라서'onRequestStart'에 정의 된 UDF는'onRequest'에서 사용할 수 없습니다. 전체 요청 스택을 통해 기능이 떨어지게하려면 요청을 'Request'범위에 추가해야합니다. 그렇지 않으면 함수를'onRequest'에 포함하거나 전체 요청을 통해 영속적 인 범위로 이동하십시오. 각각의 메소드에서'variables' 스코프를'cfdump'로 검증 할 수 있습니다. –

+0

그래서 Ben Nadel의 블로그에서 온 것입니다 : OnRequestStart() 이것은 페이지 요청이 처음 실행될 때 발생합니다. 이것은 단일 스레드 메소드 호출입니다. OnRequest() 요청 된 템플릿을 처리해야 할 때 발생합니다. == 그렇다면 OnRequestStart()에서 변수 집합과 검사를 수행하고 OnRequest()에서 모든 템플릿 포함을 완료해야한다고 제안하는 것입니까? –

+0

나는 보안을 위해'onRequestStart' 만 사용합니다. 나는 템플릿에 대한 권한을 확인하고, 사용자가 있어야 할 곳이 아닌지 확인하고, 나머지 요청을'onRequest'에서 처리 할 것입니다. 또한 영구적 인'Request' 스코프 변수를 설정하는 데 사용할 수도 있지만 그 이상은 아닙니다. –