문제

문제 : 요청할 때 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()>...

남은 논리를 해당 청크 안에 꽂으십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top