В Coldfusion, как мне начать компонент, расположенный над текущей папкой пути?

Если у меня есть структура папок, которая выглядит так:

/
/bin/myComponent.cfc
/reports/index.cfm

Как мне запустить myComponent.cfc из index.cfm?

myService = createObject("component", "bin.myComponent");

Используя синтаксис точек, я знаю, как перейти к более глубоким папкам, но как это сделать, я поднимаю папку и вниз в другую папку? Используя синтаксис слэш, это будет примерно так:

../bin/myComponent.cfc

Но createObject() не работает таким образом. Я хотел бы сохранить относительный путь, чтобы переместить эту папку на другой сервер, не нарушая пути.

Идеи? Спасибо!

EDIT:

В моем примере не было достаточно глубокой структуры папок для ответов на объявления, которые вы все предоставили. Вот что я должен был сделать:

/[my project folder]/
/[my project folder]/bin/myComponent.cfc
/[my project folder]/reports/index.cfm

Мой основной вопрос состоял в том, было ли возможно перейти в каталог при использовании createObject ( "component", "dot path" ) из index.cfm в myComponent.cfc ЕСЛИ имя [папка моего проекта] не является статическим в все установки проекта.

Если ответ НЕТ, тогда мне просто нужно выяснить, что такое лучшая практика, будь то сопоставление или настройка приложения.

Ответы

Ответ 1

Мы обрабатываем это с помощью сопоставления в администраторе cf. Обычно все компоненты входят в один каталог, который находится выше корня www. В вашем случае вы можете добавить сопоставление в /, которое позволит вам сделать:

myService = createObject("component", "mymapping.bin.myComponent");

Ответ 2

если у вас есть Application.cfc в корне вашей структуры папок, вы можете использовать что-то вроде этого:

<cfset this.mappings["/local"] = getDirectoryFromPath(getCurrentTemplatePath()) />

а затем получить доступ к нему через "local.bin.myComponent"

Ответ 3

Это конец тяжелой недели, поэтому довольно вероятно, что следующий код может быть как-то усилен, но в целом этот подход должен работать:

<cfscript>

    // this script is here http://XXXXXXX/test/paths/relative/reports/index.cfm
    // component is here http://XXXXXXX/test/paths/relative/bin/myComponent.cfc

    local = {};

    // initialize with dynamic mapping
    local.myComponentDynamic = createObject("component", "/bin/myComponent");

    // grab the current directory name
    local.parentPathExpanded = ExpandPath("../");
    local.scriptPathExpanded = ExpandPath(cgi.SCRIPT_NAME);
    local.thisDirectory = GetDirectoryFromPath(Replace(local.scriptPathExpanded, local.parentPathExpanded, ""));

    // build base path
    local.scriptPathDirectory = GetDirectoryFromPath(cgi.SCRIPT_NAME);
    local.basePath = Replace(local.scriptPathDirectory, local.thisDirectory, "");

    // this is relative path we already know
    local.relativePath = "bin/myComponent";

    // initialize with slash-syntax (path starting with /)
    local.myComponentSlash = createObject("component", local.basePath & local.relativePath);

    // convert path to the dot-syntax
    local.dottedPath = Replace(local.basePath & local.relativePath, "/", ".", "ALL");
    local.dottedPath = Right(local.dottedPath, Len(local.dottedPath)-1);

    // initialize with dot-syntax path
    local.myComponentDot = createObject("component", local.dottedPath);

</cfscript>
<cfdump var="#local#">

Я разделил процесс на отдельные переменные и сбросил общий контейнер, чтобы упростить чтение и понять этот пример.

Но каким-либо образом , если вы можете использовать динамическое сопоставление в Application.cfc - используйте его.

EDIT:. Я добавил такой пример, предположив, что у вас есть следующий Application.cfc в родительской папке (например, "../Application.cfc", если смотреть с index.cfm):

<cfcomponent output="false">

    <cfset this.mappings["/bin"] = getDirectoryFromPath(getCurrentTemplatePath()) & "bin/" />

</cfcomponent>

Мой пример "преобразования путей" - это просто забавный обман и игра с кодом, который не очень простой подход для хороших приложений.

Ответ 4

просто используйте полный путь из корня

<cfset obj = createObject("component", "bin.cart.item")>

где item.cfc находится в [веб-корневой]/lib/cart/- это будет работать из любого места вашего кода.

Ответ 5

У меня была такая же проблема, и это было мое решение. Это довольно прямолинейно, но потребовалось несколько часов, чтобы он ударил меня. Надеюсь, это немного сэкономит.

Я начал с

<bean id="ColdBooksConnectionService" class="myservice.model.service.ConnectionService" />

и всегда получил ошибку, что он недоступен, поэтому я написал полный путь

<bean id="ColdBooksConnectionService" class="/CFIDE.administrator.myservice.model.service.ConnectionService" />

и проблема решена.

Надеюсь, что это поможет.