Пользовательские функции ColdFusion из включенного файла недоступны - PullRequest
1 голос
/ 07 сентября 2011

Я использую ColdFusion 9.

Я включаю библиотеку UDF (UDF_Library.cfm), в которой есть всего несколько функций. Когда я пытаюсь получить доступ к функциям, я получаю сообщение об ошибке «Переменная POPUP не определена». Библиотека включена в Application.cfc как первая часть метода onRequestStart.

Вот как я включаю библиотеку:

<cfscript>
// INCLUDE UDF_LIBRARY
include "/UDF/UDF_Library.cfm";
</cfscript>         

Вот содержимое библиотеки:

<cfscript>
function popUp() {
    return "AAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
}
</cfscript>         

Я знаю, что функция работает. Когда я просто записываю функцию прямо в файл и вызываю ее, она работает нормально.

<cfscript>
writeOutput(popUp());
function popUp() {
    return "AAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
}
</cfscript>         

Почему эта функция не отображается при включении в UDF в файле application.cfc до загрузки какой-либо части страницы?

Ответы [ 3 ]

5 голосов
/ 08 сентября 2011

Я думаю, что отсутствующая информация во всех приведенных здесь руководствах - это предложение понять, как работает область видимости переменных, которая не имеет никакого отношения к тому, в каком обработчике событий Application.cfc можно было бы объявить функцию.

Обработчики событий Application.cfc не придают магической стойкости вещам, первоначально объявленным в них: все же необходимо поместить любые объявленные переменные или функции в область видимости, соответствующую тому, как они будут доступны. Объявление переменной в onRequestStart (или onRequest) волшебным образом не делает эту переменную доступной для всего в запросе. А функция - это просто переменная.

Когда один включает файл - как вы делаете - любые объявления переменных (и, соответственно, объявления функций) находятся в любой области видимости, в которую они их помещают. Если кто-то объявляет функцию и больше ничего с ней не делает, то функция существует только в области видимости переменных.

Если объявить функцию в onRequestStart (), который является просто методом в экземпляре Application.cfc, который создается в начале каждого запроса, то функция будет помещена в область действия переменных этого экземпляра CFC. И будет длиться ровно столько, сколько длится жизнь этого экземпляра ХФУ. Что касается выполнения onRequestStart (), экземпляр CFC длится столько времени, сколько требуется для запуска onRequestStart (). Так что не долго.

С другой стороны, onRequest () не является обработчиком события (как onRequestStart ()), это событие перехватчик : оно происходит вместо события, которое оно перехватывает , В общем случае onRequest () включает - буквально - запрашиваемый шаблон. Таким образом, запрашиваемый шаблон выполняется в том же пространстве памяти, что и экземпляр CFC, включая его (через onRequest ()), поэтому включенный шаблон разделяет область действия переменных экземпляра CFC и, соответственно, область действия переменных, доступную для onRequest (). Так что если onRequest () включает библиотеку UDF, которая объявляет набор функций в области видимости переменных ... это та же область видимости переменных, что и в основном запрошенном файле, включенном в перехватчик onRequest (). То же, что и любой другой метод экземпляра CFC, включая файлы.

Итак ... результатом этого является то, что простое включение файла с полным набором функций в onRequestStart () делает не то, что вы хотите, - надеюсь, сейчас - по очевидным причинам. В равной степени включение файла, полного функций в onRequest (), не придает им волшебной настойчивости: они просто помещаются в область видимости переменных. Это означает, что они будут доступны для запрошенного шаблона и любого шаблона, который он включает. Они не будут доступны ни для одного пользовательского тега, ни для любого экземпляра CFC, используемого в этом запросе.

Если кто-то хочет, чтобы функция (или «некоторые функции») была доступна для любого кода в запросе, необходимо поместить эти функции в область запроса (или другую общую область). И способ сделать это такой же, как с любой переменной:

request.something  = somethingElse;

Вот и все. Это единственный способ сделать это. Включение файла, полного функций, не будет полным решением для того, что вы хотите сделать, независимо от того, как вы его включаете.

2 голосов
/ 07 сентября 2011

Я думаю, что было бы лучше хранить библиотеку UDF в постоянной области, например, в приложении или сеансе. Лично я бы следовал схеме, обсужденной Беном Наделем: http://www.bennadel.com/blog/257-My-ColdFusion-User-Defined-Function-Library-Structure.htm.

2 голосов
/ 07 сентября 2011

Я считаю, что для универсальной доступности функций они должны быть включены в onRequest (), а не в OnRequestStart ().

...