Тестирование на наличие области действия / структуры FORM в ColdFusion - PullRequest
2 голосов
/ 30 июля 2009

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

<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>

Ответы [ 5 ]

8 голосов
/ 30 июля 2009

Возможно, попробуйте добавить:

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

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

4 голосов
/ 30 июля 2009

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

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

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

3 голосов
/ 05 января 2010

В этом сообщении Бена Наделя приводится подробный список областей, доступных для различных типов запросов.

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

2 голосов
/ 01 августа 2009

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

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

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

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

(вверху вашего 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>

В этом случае вы будете проверять это.resetAppVars. Вы также можете ограничить это локально, используя <cfset var resetAppVars = false /> в качестве объявления, что делает его закрытым атрибутом вашего объекта и, вероятно, является правильным, поэтому код, вызывающий объект, не может неправильно перезаписать эту переменную не-логическим типом. В этом случае вы просто будете обращаться непосредственно к resetAppvars в своем тесте, вместо того, чтобы использовать эту область.

1 голос
/ 05 января 2010

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

<cfif NOT isSoapRequest()>...

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

...