냉담에서 형태 범위 / 구조물의 존재 테스트
-
05-07-2019 - |
문제
문제 : 요청할 때 WSDL a CFC, 다음 오류가 발생합니다. 변수 양식은 정의되지 않았습니다. 이 코드 라인에서 Application.cfc의 OnRequestStart 메소드에서 발생합니다.
<cfif structKeyExists(form,'resetappvars')>
<cfset OnApplicationStart() />
</cfif>
특정 방법을 요청하면 제대로 작동합니다. CFPARAM을 사용하여 존재하지 않으면 기본 형태 구조를 만드는 것을 고려했지만 추악한 해킹처럼 보이며 실제로 CFC의 변수 또는이 범위에서 형태 구조물을 생성 할까 걱정됩니다. 아마도 이것은 합법적 인 버그일까요?
메모: 메소드를 직접 호출하면 WSDL을 요청할 때만 발생합니다. 코드는 문제없이 예상대로 실행됩니다.
업데이트: Application.cfc 코드 샘플 - 앱에 CFC를 추가하고 요청하십시오. ?wsdl
문제를 보려면. 이것은 ColdFusion 7 및 ColdFusion 8에서 테스트 (및 실패)되었습니다.
<cfcomponent output="false">
<cffunction name="OnApplicationStart" access="public" returntype="boolean" output="false" hint="Fires when the application is first created.">
<cfset application.dsn = "my_dsn" />
<cfreturn true />
</cffunction>
<cffunction name="OnRequestStart" access="public" returntype="boolean" output="false" hint="Fires at first part of page processing.">
<cfargument name="TargetPage" type="string" required="true" />
<cfif structKeyExists(form,'resetappvars')>
<cfset OnApplicationStart() />
</cfif>
<cfreturn true />
</cffunction>
</cfcomponent>
해결책
이것 벤 나델의 게시물 다양한 유형의 요청에 사용할 수있는 상세한 범위 목록을 제공합니다.
그것을 읽으면 쉽게 알 수 있습니다 형태 주어진 컨텍스트에서는 범위를 사용할 수 없습니다 URL 이다.
다른 팁
A를 추가 해보십시오 :
<cfif IsDefined("form")>...</cfif>
위 코드 주위에?
당신도 할 수 있습니다 cfparam
당신이 찾고있는 변수는 논리를 약간 변경합니다 (ResetAppVars가 부울이라고 가정합니다.
<cfparam name="form.resetAppVars" default="false" />
...
<cfif form.resetAppVars>
<cfset OnApplicationStart() />
</cfif>
편집 : 위의 코드가 해킹으로 간주 될 수 있는지 확실하지 않지만 저에게는 꽤 표준 CF처럼 보입니다.
나는 그것이 의견의 문제라고 들었지만, CFC가 호출 될 때 및 방법을 사용할 수 있다는 보장이 없기 때문에 CFC 내에서 양식 범위를 참조하는 것은 부적절하다고 생각합니다. 호출됩니다. 방법에 사용할 수있는 데이터가 객체에 명시 적으로 제공되는지 확인하는 것이 좋습니다. 이것은 인수를 포함하여 수행 할 수 있습니다.
<cfargument name="resetAppVars" type="boolean" required="false" default="false" />
그런 다음 arguments.resetAppvars를 확인하면 항상 정의되지만 거짓으로 기본적으로 정의됩니다.
또는 객체에 속성을 만들고 명시 적 세트 메소드를 작성하여 :
(CFC 상단)
<cfset this.resetAppVars = false />
<cffunction name="setResetAppVars" access="public" returnType="void" output="false">
<cfargument name="flagValue" type="boolean" required="true" />
<cfset this.resetAppVars = arguments.flagValue />
</cffunction>
이 경우 this.resetappvars를 확인합니다. 당신은 또한이 로컬로 사용하여 범위를 범할 수도 있습니다 <cfset var resetAppVars = false />
선언으로서, 객체의 개인 속성을 만들고 적절할 수 있으므로 객체를 호출하는 코드는이 변수를 부를 비유 유형으로 잘못 덮어 쓸 수 없습니다. 이 경우이 범위를 사용하는 대신 테스트에서 ResetAppVars를 직접 참조합니다.
당신은 또한 이것을 할 수 있습니다 :
<cfif NOT isSoapRequest()>...
남은 논리를 해당 청크 안에 꽂으십시오.