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>

另一个或两个概念,因为您正在会话中寻找一个结构是:

<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

正如上面提到的 Al Everett,我不记得上次我有一个没有启用会话的应用程序是什么时候。我想如果你不能确定,那么看看 Session 是否存在是有意义的。我的代码将包括:

<!--- 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 回答
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 回答
0
<cfif structkeyexists(session, "data") and structkeyexists(session["data"], key)>
...
</cfif>
于 2012-06-19T15:13:59.483 回答
0

为什么不直接打电话<cfif isNull(session.data.fromdate)>

如果keydata不存在session则不会抛出,只是返回false。

于 2012-06-21T14:17:41.003 回答