0

セッション ヘルパーを作成しようとしていますが、セッションに Struct キーが存在するかどうかをテストするという問題に直面していますか?

私はのようにしようとしています

<cffunction name="Exists" access="public" output="false" returntype="boolean" >
    <cfargument name="Key" required="true" type="Any" />
    <cfreturn Evaluate( "StructKeyExists( Session, #Arguments.Key# )" ) />
</cffunction>

次のような関数を呼び出している場所

<cfif Exists("data.fromdate") >
 ...
</cfif>

どのように書けばよいですか?

ありがとう

4

5 に答える 5

4

キー「Test」がセッション構造体に存在するかどうかを確認する場合は、次のようにしてみてください。

<cffunction name="Exists" access="public" output="false" returntype="boolean" >
    <cfargument name="Key" required="true" type="String" />

    <cfreturn StructKeyExists(session, arguments.Key) />
</cffunction>


<cfif Exists("Test") >
 ....
</cfif>

セッション内で構造体を探しているので、もう1つまたは2つの概念は次のようになります。

<cffunction name="Exists" access="public" output="false" returntype="boolean" >
    <cfargument name="Key" required="true" type="String" />

    <cfreturn (structKeyExists(session, listFirst(arguments.Key,"."))
                AND structKeyExists(session[listFirst(arguments.Key,".")], listLast(arguments.Key, "."))) />
</cffunction>

<cfif Exists("data.Test") >
....
</cfif>

<cffunction name="Exists" access="public" output="false" returntype="boolean" >
    <cfargument name="struct" required="true" type="String" />
    <cfargument name="Key" required="true" type="String" />

    <cfreturn (structKeyExists(session, arguments.struct)
                AND structKeyExists(session[arguments.struct], arguments.key)) />
</cffunction>

<cfif Exists("data", "Test") >
 ....
</cfif>

これがすべてあなたを正しい方向に向けるのに役立つことを願っています、頑張ってください!

于 2012-06-19T12:33:39.913 に答える
1

次のコードは、深さ構造体をチェックし、Session スコープを正しくロックします。

<cffunction name="Exists" access="public" output="false" returntype="boolean">
    <cfargument name="Key" required="true" type="string">

    <cfset local.mainKeyList = ListChangeDelims(ListDeleteAt(Arguments.Key, ListLen(Arguments.Key, "."), "."), ",", ".")>

    <cfset local.StructChain = "Session">
    <cfloop list="#local.mainKeyList#" index="local.CurrentKey">
        <cfset local.StructChain &= '["#local.CurrentKey#"]'>
    </cfloop>

    <cflock scope="session" type="readonly" timeout="3">
        <cftry>
            <cfset local.Exists = StructKeyExists(Evaluate(local.StructChain), ListLast(Arguments.Key, "."))>

            <cfcatch>
                <cfset local.Exists = false>
            </cfcatch>
        </cftry>
    </cflock>

    <cfreturn local.Exists>
</cffunction>

<cflock scope="session" type="exclusive" timeout="3">
    <cfset Session.data.log.deep = "I'm here!">
</cflock>
<cfoutput>#Exists("data.log.deep")#</cfoutput>

願わくば、この関数のコードの量が、なぜヘルパー関数が有用なのかをあなたの理由を熟考している人々に正当化することを願っています. これは現在ではありませんが、強化される可能性があり、配列内の構造体も処理します。これはまた、空の Arguments.Key を処理したり、cflock タイムアウトで正常に失敗したりしませんが、開始する必要があります。

さらに、cflock は必要ないとコメントしたい場合は、まずColdFusion cflock ドキュメントをお読みください。

簡略化されていますが、非常にまれな状況で不正確な結果が得られる場合があります

コード内でインライン化を行うIsDefinedと、誤検知の可能性が生じますが、IsDefined内部に udf または cfc メソッドを配置すると、このリスクが大幅に軽減され、考慮する必要がなくなる可能性があります。そのチャンスを喜んで利用する場合はIsDefined、Peter Boughton が提案するように関数を単純化できます。

<cffunction name="Exists" access="public" output="false" returntype="boolean">
    <cfargument name="Key" required="true" type="string">

    <cflock scope="session" type="readonly" timeout="3">
        <cfset local.Exists = IsDefined("Session." & Arguments.Key)>
    </cflock>

    <cfreturn local.Exists>
</cffunction>
于 2012-06-19T23:10:18.750 に答える
1

Al Everett が上で述べたように、セッションが有効になっていないアプリを最後に使用したのはいつか覚えていません。確信が持てない場合は、セッションが存在するかどうかを確認するのが理にかなっていると思います。このための私のコードは次のとおりです。

<!--- in the application.cfc --->
<cffunction name="onSessionStart" output="false">
    <!--- default session structure, you can also add default values to the data
         structure here to ensure they exist later --->
    <cfset session.data = {} />
</cffunction>

<!--- then in code use structKeyExists instead of a whole new function --->
<cfif structKeyExists(session.data, myKey)>

<!--- if you really wanted the "exists" function --->
<cffunction name="dataKeyExists" returntype="boolean" output="false">
    <cfargument name="key" required="true" />
    <cfreturn structKeyExists(session.data, arguments.key) />
</cffunction>

状況によっては、カプセル化を維持するためにセッションをパスすることを選択する場合があります。しかし、パターンを維持するためだけに OO の奴隷になって複雑さを導入することは、常に意味があるとは限りません。セッション構造を渡してキーを評価することは、「structKeyExists」関数を使用するための大きな回避策です。

また、「exists」という関数があるのも嫌いです。なぜなら、それが実際に評価しているものについて何も教えてくれないからです。そのような関数は「isDefined」のようなもので、特定の構造のキーをテストするだけではなく、より一般的であると思います。

于 2012-06-19T14:44:54.107 に答える
0
<cfif structkeyexists(session, "data") and structkeyexists(session["data"], key)>
...
</cfif>
于 2012-06-19T15:13:59.483 に答える
0

なぜ電話しないのですか<cfif isNull(session.data.fromdate)>

キーdataが存在しない場合sessionはスローせず、単に false を返します。

于 2012-06-21T14:17:41.003 に答える