Question

Problème: lors de la demande du WSDL pour un CFC , l'erreur suivante apparaît: La variable FORM est indéfinie . Cela se produit dans cette ligne de code, dans la méthode OnRequestStart dans application.cfc

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

Si je demande une méthode spécifique, cela fonctionne bien. J'ai envisagé d'utiliser cfparam pour créer une structure de formulaire par défaut s'il n'en existe aucune, mais cela ressemble à un bidouillage moche et je crains que cela ne crée réellement la structure de formulaire dans les variables ou cette portée du CFC. C’est peut-être aussi un bug légitime?

Remarque: Cela ne se produit que lorsque je demande le WSDL, si j'appelle directement une méthode - le code s'exécute comme prévu sans problèmes.

Mise à jour: Exemple de code Application.cfc: ajoutez simplement un CFC à votre application et demandez-le avec ?wsdl pour voir le problème. Ceci a été testé (et a échoué) sur ColdFusion 7 et 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>
Était-ce utile?

La solution

Ce le message de Ben Nadel donne une liste détaillée des portées disponibles pour différents types de demandes.

En le lisant, vous pouvez facilement vous rendre compte que le formulaire n'est pas disponible dans un contexte donné, mais url l'est.

Autres conseils

Peut-être essayez-vous d'ajouter un:

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

autour du code ci-dessus?

Vous pouvez également cfparam choisir la variable que vous cherchez, puis modifiez légèrement votre logique (en supposant que resetAppVars soit un booléen:

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

Éditer: Je ne suis pas sûr que le code ci-dessus puisse être considéré comme un piratage, mais cela me semble plutôt standard, comme CF.

J'ai entendu dire que c'était simplement une question d'opinion, mais il me semble qu'il est inapproprié de faire référence à votre formulaire dans un CFC, car rien ne garantit qu'il sera disponible lorsque votre cfc sera invoqué et quand votre méthode est appelée. Il est préférable de s'assurer que toutes les données devant être disponibles pour la méthode sont fournies explicitement à votre objet. Cela peut être fait soit en incluant un argument:

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

Ensuite, vous vérifiez les arguments.resetAppVars et il est toujours défini, mais la valeur par défaut est false.

Ou en créant un attribut sur votre objet et en créant une méthode de définition explicite:

(en haut de votre 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>

Dans ce cas, vous vérifierez ceci.resetAppVars. Vous pouvez également définir cela localement en utilisant <cfset var resetAppVars = false /> en tant que déclaration, ce qui en fait un attribut privé de votre objet et est probablement correct. Par conséquent, le code qui appelle l'objet ne peut pas écraser de manière incorrecte cette variable avec un type non booléen. Dans ce cas, vous vous référez simplement à resetAppvars dans votre test, au lieu d’utiliser cette portée.

Vous pouvez également faire ceci:

<cfif NOT isSoapRequest()>...

et collez votre logique restante à l'intérieur de ce bloc.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top