Существует ли способ указать путь компонента в теге?
Я использую Компоненты ColdFusion для своего приложения. Мое приложение имеет несколько папок, однако, и каждый раз, когда я хочу, чтобы CFC работал, я должен сохранить его в том же каталоге как те файлы, которые должны получить доступ. Это приводит к моему созданию нескольких файлов CFC, которые идентичны.
Существует ли способ сохранить мой CFCs в одном каталоге и заставить его работать через мой сайт?
Как отмечали другие, вы можете делать интересные вещи с сопоставлениями и функциями, которые определяют местонахождение корня вашего приложения, но в основе вашего вопроса лежит общий путь Технические характеристики.
Я предлагаю вам прочитать часть документации Использование компонентов ColdFusion под названием Указание местоположения CFC .
По сути, это говорит о том, что если ваше приложение находится по адресу http://example.com/myApp/ , а у вас есть страница по адресу http://example.com/myApp/ foo / bar / fubar.cfm , который хочет использовать компонент по адресу:
/myApp/foo/components/library/fubar.cfc
, тогда fubar.cfm должен сделать что-то вроде этого:
<cfset fubar=createObject("component", "myApp.foo.components.library.fubar") />
Вы берете путь к файлу и заменяете косые черты точками (aka "точка обозначение "), а также удалите" .cfc "из имени файла компонента, который вы хотите загрузить.
Кроме того, вы можете использовать именованные сопоставления (как описал Аарон), поэтому, если вы создаете сопоставление с именем / components
, которое указывает на / myApp / foo / components /
, тогда ваше Вызов createObject будет выглядеть так:
<cfset fubar = createObject("component", "components.library.fubar") />
Те же пути с точечной нотацией могут использоваться в
как часть атрибута компонента :
<cfinvoke component="components.library.fubar" ... />
/
lib/
DataAccess.cfc
IndexingService.cfc
app/
Application.cfc
index.cfm
/app/Application.cfc
component {
root = goUpDirectory(2, GetCurrentTemplatePath());
This.mappings["/lib"] = "#root#/lib";
This.mappings["/app"] = "#root#/app";
function goUpDirectory(levels, path) {
for(levels = levels; levels >= 1; levels -= 1) {
path = GetDirectoryFromPath(path);
path = Left(path, Len(path) - 1);
}
return path;
}
}
/app/controllers/UsersController.cfc
component {
...
da = new lib.DataAccess();
...
}
То же, что и выше, только с использованием CreateObject
вместо new
, < cfcomponent />
вместо component {}
и т. д.
Здесь можно поступить по-разному. Я бы рекомендовал поместить компоненты туда, где они имеют смысл (root/com, или root/models, или что-то еще), а затем ссылаться на них из базы приложения.
В администраторе ColdFusion вы можете установить сопоставленный путь к корню вашего приложения и ссылаться на ваши компоненты по этому пути.
myObject = createObject('component','nameOfMyMapping.models.service.answerStackOverflowQuestions');
Вы также можете выполнить некоторую логику в вашем Application.cfm / Application.cfc, чтобы найти корень приложения динамически. Этот метод не требует специальных разрешений и будет работать, если вы переместите приложение в другую среду. Быстрый поиск в Google обнаружил запись в блоге Питера Фрейтага с функцией, которая делает именно это. Только не забудьте заменить .cfm, если вы используете приложение .cfc. http://www.petefreitag.com/item/630.cfm
CFLib.org также имеет метод, который, похоже, найдет корневой путь за вас. http://www.cflib.org/udf/GetRootPath
После того, как вы сохранили корневой путь в переменной, все становится проще.
myObject = createObject('component','#myRoot#.models.service.answerStackOverflowQuestions');
Наконец, многие фреймворки сделали эту и многие другие распространенные задачи очень простыми. Вы можете выбрать практически любой фреймворк ColdFusion. Кто-то уже изобрел колесо ;).
Веселитесь!