Frage

Problem: Wenn die WSDL für eine CFC , erhalte ich folgende Fehlermeldung: Variable FORM ist nicht definiert, . Es geschieht in dieser Code-Zeile, in der OnRequestStart Methode in Application.cfc

<cfif structKeyExists(form,'resetappvars')>
    <cfset OnApplicationStart() />
</cfif>

Wenn ich eine bestimmte Methode anfordern, es funktioniert gut. Ich habe mit cfparam als ein Standardformular Struktur zu erstellen, wenn keine vorhanden ist, aber das scheint wie eine hässliche Hack und mir Sorge, es wird tatsächlich die Form Struktur in den Variablen oder diesen Bereich des CFC erstellen. Vielleicht ist dies ein legitimer Fehler als auch?

. Hinweis: Dies geschieht nur, wenn ich die WSDL anfordern, wenn ich eine Methode direkt aufrufen - der Code als ohne Probleme zu erwarten ausführt

Update: Application.cfc Codebeispiel - fügen Sie einfach einen beliebigen CFC, um Ihre Anwendung und fordert ihn mit ?wsdl das Problem zu sehen. Dies wurde getestet (und nicht) auf Coldfusion 7 und 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>
War es hilfreich?

Lösung

Der Beitrag von Ben Nadel gibt detaillierte Liste verfügbar Bereiche für unterschiedliche Arten von Anfragen.

Mit dem Lesen können Sie ganz einfach herausfinden, dass Form Umfang in bestimmtem Kontext nicht verfügbar ist, aber URL ist.

Andere Tipps

Vielleicht versuchen Sie, ein:

 <cfif IsDefined("form")>...</cfif>

um den obigen Code?

Sie auch die Variable cfparam könnten Sie suchen dann nur Ihre Logik ändern, um ein wenig (unter der Annahme resetAppVars ist ein boolean:

<cfparam name="form.resetAppVars" default="false" />
...
<cfif form.resetAppVars>
  <cfset OnApplicationStart() />
</cfif>

Edit:. Ich bin mir nicht sicher, ob der obige Code könnte einen Hack in Betracht gezogen werden, aber es scheint ziemlich Standard CF, mir

Ich habe gehört, es ist nur eine Frage der Meinung, aber es scheint mir, dass es unangemessen ist Ihre Form Umfang innerhalb eines CFC zu verweisen, da es keine Garantie dafür gibt, dass das Formular Umfang zur Verfügung stehen wird, wenn der cfc aufgerufen wird und wenn Ihre Methode aufgerufen wird. Es ist besser, um sicherzustellen, dass alle Daten, die auf das Verfahren zur Verfügung stehen muss, ist ausdrücklich zu Ihrem Objekt zur Verfügung gestellt. Dies kann entweder, indem ein Argument:

<cfargument name="resetAppVars" type="boolean" required="false" default="false" />

Sie dann arguments.resetAppVars überprüfen, und es wird immer definiert, aber standardmäßig auf false.

oder durch ein Attribut auf dem Objekt zu erzeugen und eine explizite Set-Methode zu erstellen:

(an der Spitze Ihres 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>

In diesem Fall werden Sie gegen this.resetAppVars überprüfen. Sie können auch Umfang diese lokal mit <cfset var resetAppVars = false /> als Erklärung, die es ein privates Attribut des Objekts macht, und ist wahrscheinlich richtig, so Code, der das Objekt aufruft, kann nicht falsch diese Variable mit einem nicht-boolean Typ überschreiben. In diesem Fall würde man einfach direkt auf resetAppvars in Ihrem Test bezieht, anstatt diesen Bereich zu verwenden.

Sie können auch dies tun:

<cfif NOT isSoapRequest()>...

und halten weitere Logik innerhalb dieser Brocken.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top