【问题标题】:Testing for existence of FORM scope / struct in ColdFusion在 ColdFusion 中测试 FORM 范围/结构的存在
【发布时间】:2010-11-15 10:54:51
【问题描述】:

问题:在为CFC 请求WSDL 时,我收到以下错误:变量形式未定义。它发生在这行代码中,在 application.cfc 中的 OnRequestStart 方法中

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

如果我请求特定方法,它可以正常工作。如果不存在,我曾考虑使用 cfparam 创建默认表单结构,但这似乎是一个丑陋的 hack,我担心它实际上会在 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>

【问题讨论】:

  • 你认为你有一个案例问题,如果你不在 Windows 上,即使我有使用 railo 的经验,我在大小写转换方面遇到了很多奇怪的问题,不得不在某些情况下放弃 camelCase all在一起。

标签: coldfusion railo application.cfc


【解决方案1】:

你也可以这样做:

<cfif NOT isSoapRequest()>...

并将剩余的逻辑粘贴在该块中。

【讨论】:

【解决方案2】:

post of Ben Nadel 提供了可用于不同类型请求的范围的详细列表。

通过阅读,您可以轻松发现 form 范围在给定上下文中不可用,但 url 可用。

【讨论】:

  • 感谢您的帖子 - 但我怎么知道我收到了 WSDL 请求?解析 URL 范围?
  • 是的...似乎 StructKeyExists(url, "wsdl") 可以是最简单的方法。就我个人而言,我在识别方面没有这样的问题,因为使用单独的 CFC 服务,它们只是扩展了所需的核心组件。它提供了更清晰的项目结构,例如 /api/api.cfc?wsdl 在某些方面优于 /components/core/model/webServiceLayerManager.cfc?wsdl。
【解决方案3】:

我听说这只是一个意见问题,但在我看来,在 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。您还可以使用 &lt;cfset var resetAppVars = false /&gt; 作为声明在本地范围内,这使其成为对象的私有属性,并且可能是正确的,因此调用对象的代码不能不正确地用非布尔类型覆盖此变量。在这种情况下,您只需在测试中直接引用 resetAppvars,而不是使用此范围。

【讨论】:

  • 我通常同意在 CFC 中引用表单范围是不合适的。但是,在 application.cfc onRequestStart 方法中,考虑引用表单范围似乎是一个合法的地方。另外值得注意的是,仅当我尝试使用远程方法检索 cfc 的 WSDL 时才会发生此错误。
【解决方案4】:

你也可以cfparam你正在寻找的变量然后稍微改变你的逻辑(假设resetAppVars是一个布尔值:

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

编辑:我不确定上面的代码是否可以被认为是 hack,但对我来说,这似乎是非常标准的 CF。

【讨论】:

    【解决方案5】:

    也许可以尝试添加:

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

    围绕上面的代码?

    【讨论】:

    • IsDefined("form.resetappvars") 是发帖人想要的,我想。
    猜你喜欢
    • 2012-09-18
    • 2014-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多