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)

Боюсь, я бы не стал делать это так, как ты это делаешь.

Другие вопросы по тегам