CFC, которые вводят дополнительные функции через include
Мой application.cfc начинается с:
<cfcomponent extends="org.corfield.framework">
позже void function setupApplication() output="false" {
я имею
// tools
include "initapp.cfm";
В initapp.cfm нет ничего, кроме функций. Вещи как:
<!--- Helper functions --->
<cfscript>
string function stripHTML(str) output="false" {
return REReplaceNoCase(arguments.str,"<[^>]*>","","ALL");
}
application.stripHTML = stripHTML;
</cfscript>
Характер функций НЕ связан с сеансом. Есть ли лучший способ сделать функции доступными во всем мире?
2 ответа
Если вы пытаетесь объединить вспомогательные функции для использования в CFC, одним из вариантов может быть использование файла component.cfc.
Использование файла component.cfc
Все CFC автоматически расширяют компонент ColdFusion WEB-INF/cftags/component.cfc. (Каталог WEB-INF находится в каталоге cf_root/wwwroot на ColdFusion, настроенном со встроенным сервером J2EE. Он находится в каталоге cf_root при развертывании ColdFusion на сервере J2EE.) Этот CFC распространяется в виде файла нулевой длины. Вы можете использовать его для любых основных методов или свойств, которые вы хотите, чтобы все CFC в вашем экземпляре сервера приложений ColdFusion наследовали.
Примечание. При установке более новой версии ColdFusion процедура установки заменяет существующий файл component.cfc новой версией. Поэтому перед обновлением необходимо сохранить любой код, добавленный в файл component.cfc, а затем скопировать код в новый файл component.cfc.
Если это решение СЛИШКОМ глобально, вы можете расширить свой помощник cfc, но это должно быть сделано в каждом cfc, и оно не отвечает вашей идее "один раз установить и забыть". См. Эффективное использование ХФУ
Если ваши вспомогательные функции предназначены для использования в файлах.cfm, я бы поступил так, как предложил Адам. Я обычно помещаю свои вспомогательные функции в cfc "tools", расположенный в папке CFC, и делаю его cfc в области приложения.
function onApplicationStart(){
application.tools = createObject("component", "cfc.tools");
}
Одна из моих вспомогательных функций регистрирует время, необходимое для индексации коллекции solr. Используя это выглядит как
<cfset application.tools.logSolrIndex('collectionName',getTickCount()-start,qFileList.recordCount)>
В крайнем случае : если вам нужно было использовать include для использования вне application.cfc, я мог бы просто включить initapp.cfm onRequest() перед тем, как включить вашу страницу.
Поместите функции в CFC библиотеки, а затем поместите экземпляр этого CFC в область приложения в onApplicationStart()
,
Тем не менее, вы бы как-то нарушили инкапсуляцию, если бы затем ссылались на этот CFC, относящийся к области применения, в других CFC, что является соображением (не обязательно нарушителем, но соображением).
Вы могли бы взглянуть на какой-то подход внедрения зависимости, чтобы смягчить это (например: ColdSpring)
Боюсь, я бы не стал делать это так, как ты это делаешь.