ColdFusionでのFORMスコープ/構造体の存在のテスト
-
05-07-2019 - |
質問
問題:
<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>
解決
この Ben Nadelの投稿には、さまざまなタイプのリクエストに使用可能なスコープ。
これを読むと、特定のコンテキストでは form スコープは使用できませんが、 url は使用できることが簡単にわかります。
他のヒント
次を追加してみてください:
<cfif IsDefined("form")>...</cfif>
上記のコードの周り?
cfparam
探している変数を、ロジックを少し変更するだけでも構いません(resetAppVarsがブール値であると仮定:
<cfparam name="form.resetAppVars" default="false" />
...
<cfif form.resetAppVars>
<cfset OnApplicationStart() />
</cfif>
編集:上記のコードがハックと見なされるかどうかはわかりませんが、私にはかなり標準的なCFのようです。
それは単なる意見の問題だと聞きましたが、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を直接参照するだけです。
これを行うこともできます:
<cfif NOT isSoapRequest()>...
そして残りのロジックをそのチャンク内に固定します。