2009-07-30 2 views
2

Проблема: при запросе WSDL для CFC возникает следующая ошибка: Переменная FORM не определена. Это происходит в этой строке кода в методе OnRequestStart в Application.cfcТестирование на наличие области или структуры FORM в ColdFusion

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

Если запросить конкретный метод, он отлично работает. Я рассмотрел использование cfparam для создания структуры по умолчанию, если он не существует, но это кажется уродливым взломом, и я беспокоюсь, что он фактически создаст структуру формы в переменных или в этой области CFC. Может, это и законная ошибка?

Примечание: Это происходит, когда я запрашиваю WSDL, если я вызываю метод напрямую - код выполняется как ожидалось без проблем.

Обновление: Образец примера приложения.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> 
+0

Вы считаете, что у вас проблема с корпусом, если вы не на окнах, и даже с моим опытом работы с рельсо, у меня было много странной проблемы с преобразованием случая, вам придется в какой-то обсадной канаве camelCase все вместе. – ethyreal

ответ

3

Этот post of Ben Nadel содержит подробный список областей, доступных для различных типов запросов.

Читая его, вы можете легко узнать, что формы области недоступна в данном контексте, но URL есть.

+0

Спасибо за сообщение, но как узнать, что я получаю запрос WSDL? Разбирайте область URL? – Goyuix

+0

Да ... Кажется, что StructKeyExists (url, "wsdl") может быть самым простым способом. Лично у меня нет таких проблем с идентификацией, потому что, используя отдельные CFC для сервисов, они просто расширяют необходимые основные компоненты. Он дает более четкую структуру проекта, скажем, /api/api.cfc?wsdl лучше, чем /components/core/model/webServiceLayerManager.cfc?wsdl в некотором роде. – Sergii

8

Может быть, попробуйте добавить:

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

вокруг кода выше?

+1

+1. Это единственный раз, когда я использовал IsDefined(). – ale

+1

IsDefined («form.resetappvars») - то, что хочет плакат, я думаю. – Henry

4

Вы могли бы также cfparam переменная вы ищете, то просто изменить логику немного (предполагая, что resetAppVars является булевой:

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

Edit: Я не уверен, если приведенный выше код может быть рассмотрен хак, но это кажется довольно стандартным CF, мне.

2

Я слышал, что это всего лишь вопрос мнения, но мне кажется, что неверно ссылаться на сферу вашей формы внутри CFC, поскольку нет убедитесь, что область формы будет доступна при вызове cfc и при вызове метода. Лучше убедиться, что любые данные, которые должны быть avai lable к методу явно предоставляется вашему объекту. Это может быть сделано либо путем включения аргумента:

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

Тогда вы проверяете arguments.resetAppVars, и он всегда определяется, но по умолчанию лжи.

Или создания атрибута на вашем объекте и создание явного метода набора:

(в верхней части ск)

<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 в своем тесте вместо использования этой области.

+0

Я бы согласился с тем, что нецелесообразно ссылаться на область формы внутри CFC. Однако в методе application.cfc onRequestStart представляется законным местом рассмотрения ссылки на область формы. Также следует отметить, что эта ошибка ТОЛЬКО случается, когда я пытаюсь получить WSDL для cfc с помощью удаленных методов. – Goyuix

1

Вы также можете сделать это:

<cfif NOT isSoapRequest()>... 

и совать оставшуюся логику внутри этого фрагмента.

+0

Есть проблемы с использованием isSoapRequest в методе onRequestStart: http://www.petefreitag.com/item/733.cfm – Goyuix

+0

GAH. Спасибо Goyuix –

Смежные вопросы