использование функций включенного файла заставляет coldfusion забыть об импорте. Это нормально?

Я заметил, что когда я вызываю функцию ранее включенного (cfinclude) файла .cfm, все импорты coldfusion (cfimport), которые произошли на этом этапе, забываются. Как будто вы ничего не импортировали. Я нашел это очень странным поведением, поэтому я изолировал его, но результаты остались прежними, даже в coldfusion 10.

Моя установка:

/пример

  • functions.cfm
  • index.cfm
  • /components
    • MyCFC.cfc

functions.cfm:

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

компоненты/MyCFC.cfc:

component  output="false"{}

index.cfm:

<cfscript> включает "functions.cfm";  импортировать компоненты.MyCFC;
foo = test(); бар = новый MyCFC(); </cfscript>

Этот код вызовет ошибку coldfusion: «Не удалось найти компонент или интерфейс ColdFusion MyCFC». когда foo = test(); удаляется или помещается после bar = new MyCFC();, код работает нормально.

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

Это баг или так и должно быть?

Испытано в режимах холодного плавления 9,0,0,251028 и холодного плавления 10,282462


person jan    schedule 24.09.2012    source источник
comment
Почему вы называете свой компонент CFC расширением файла .cfm? Ваш код ведет себя по-другому, если компонент MyCFC имеет расширение файла .cfc?   -  person Miguel-F    schedule 24.09.2012
comment
Это опечатка, извините. Спасибо, что указали на это. Исправил это   -  person jan    schedule 24.09.2012
comment
Кроме того, оператор импорта заканчивается символом (); Я не вижу, чтобы это использование было задокументировано в документах CF. Кроме того, вы получаете ту же ошибку при использовании foo=test(); а не тест=тест(); . Просто интересно, что-то испортило распознаватель области   -  person barnyr    schedule 24.09.2012
comment
Это тоже была опечатка. Исправил, извините. Я попытался изменить test = test() на foo = test(), но это не решает проблему.   -  person jan    schedule 24.09.2012
comment
Ваш CFC находится в папке, относящейся к вашему index.cfm, которая называется компонентами? Просто убедитесь, что вы импортируете правильно.   -  person JamesRLamar    schedule 24.09.2012
comment
Да, это. Я поместил его в другую папку, иначе импорт не понадобился бы. Код работает, если я удаляю foo = test(); или помещаю его под bar = new MyCFC();.   -  person jan    schedule 24.09.2012
comment
Я предполагаю, что import — это просто способ cfscript использовать cfimport, верно? Вы видели это в здесь: Тег cfimport должен быть на странице, которая использует импортированные теги. Например, если вы используете тег cfimport на странице, которую вы включаете в вызов cfinclude, вы не можете использовать импортированные теги на странице с тегом cfinclude. В таких случаях ColdFusion не выдает ошибку, но импортированные теги не запускаются. Дополнительные сведения см. в спецификации Java Server, стр. 1.1.   -  person Miguel-F    schedule 24.09.2012
comment
Да, import является альтернативой cfscript для <cfimport>. Я также читал этот раздел в онлайн-документах, но этот код соответствует этому требованию. Импорт происходит в том же файле, который создает экземпляр импортируемого файла. И импорт действительно работает без строки foo = test();.   -  person jan    schedule 24.09.2012
comment
Вызов функции не должен влиять на импорт, так что это определенно похоже на ошибку... bugbase.adobe.com< /а>   -  person Peter Boughton    schedule 24.09.2012
comment
Я провел свой собственный тест и обнаружил то же самое при попытке использовать импорт непосредственно в представлении. Однако, когда я использую этот код в своем контроллере, я не получаю сообщения об ошибке. Я предполагаю, что это, безусловно, может быть связано с включением страницы, но, скорее всего, это связано с отображением CFC. Как выглядит файловая структура вашего приложения?   -  person JamesRLamar    schedule 24.09.2012
comment
Я отредактировал этот вопрос и включил файловую структуру. Я очень простой. «компоненты» относятся к папке «компоненты». В этом примере не используются пользовательские сопоставления.   -  person jan    schedule 24.09.2012
comment
На 9.0.2 не проверял, только на 9.0.0 и 10. Оба ошибались   -  person jan    schedule 25.09.2012


Ответы (2)


Так как я много импортирую, недавно я столкнулся с некоторыми странностями и сообщил об этом в базе данных об ошибках CF9: https://bugbase.adobe.com/index.cfm?event=bug&id=3288035

ColdFusion разрешает импорт только для текущего файла, и всякий раз, когда вы вызываете другой файл, это похоже на то, что «контекст выполнения» переключается на эти файлы с его импортом. Итак, в вашем случае, когда вы выполняете new, ColdFusion ищет импорт в functions.cfm. Когда вы затем вызываете метод текущего файла, он переключается обратно и находит импорт.

Если я прав, ваш код должен работать, если вы выполните bar = new MyCFC(); сразу после импорта. Или вы можете определить другой метод в index.cfm и вызвать его перед созданием класса.

Чтобы обойти эту ошибку, вам необходимо убедиться, что импорт разрешен (при первом использовании в жизненном цикле объектов) до того, как произойдет «переключение контекста». Поэтому вызовите new MyCFC(); перед внешним методом.

@Adobe: Было бы неплохо это исправить;)

person Walter Seethaler    schedule 25.09.2012
comment
Вау, ты прав. Если я добавлю функцию в index.cfm и вызову эту функцию после вызова функции test() из включенного файла, импорт снова сработает. Странное поведение стало для меня более понятным, спасибо. (Все еще досадная ошибка, к сожалению) - person jan; 25.09.2012
comment
Я добавил примечание к отчету об ошибке со ссылкой на ваш идентификатор ошибки. - person jan; 25.09.2012

Я с @PeterBoughton, это похоже на ошибку. Я не смог найти подобную ошибку, о которой сообщалось, поэтому я бы продолжил ее отправку. В то же время, если вы откажетесь от «импорта», вы все равно сможете ссылаться на CFC, используя:

bar = new components.MyCFC();

Отличный улов!

person JamesRLamar    schedule 24.09.2012