2

問題: CFCのWSDLを要求すると、次のエラーが表示されます: Variable FORM is undefined。このコード行、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>
4

5 に答える 5

8

多分追加してみてください:

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

上記のコードの周り?

于 2009-07-30T13:45:25.993 に答える
4

cfparam探している変数を変更して、ロジックを少し変更することもできます (resetAppVars がブール値であると仮定すると:

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

編集:上記のコードがハックと見なされるかどうかはわかりませんが、私にはかなり標準的なCFのようです。

于 2009-07-30T13:53:11.460 に答える
3

Ben Nadel のこの投稿では、さまざまなタイプのリクエストで使用できるスコープの詳細なリストを示しています。

それを読むことで、特定のコンテキストではフォームスコープが利用できないことを簡単に知ることができますが、 urlは利用できます。

于 2010-01-05T09:42:56.447 に答える
2

単なる意見の問題だと聞いたことがありますが、CFC が呼び出されたときにフォーム スコープが使用可能であるという保証がないため、CFC 内でフォーム スコープを参照することは不適切であるように思われます。と呼ばれます。メソッドで使用できるようにする必要があるデータがオブジェクトに明示的に提供されるようにすることをお勧めします。これは、引数を含めることで実行できます。

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

次に、arguments.resetAppVars を確認すると、常に定義されていますが、デフォルトで false に設定されています。

または、オブジェクトに属性を作成し、明示的な set メソッドを作成します。

(あなたの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 を直接参照するだけです。

于 2009-07-31T21:49:32.813 に答える