CFC расширяет родную папку - PullRequest
       18

CFC расширяет родную папку

6 голосов
/ 23 октября 2010

Я видел все виды решений по расширению cfcs в родительских папках с доступом к родительским файлам или администрированию CF, но я не видел работоспособного решения по расширению cfc в папке «shared» / sibling без доступа к родительские папки.

Для этого решения требуется доступ к родительским папкам? (Не уверен, что это за сопоставления, но у меня нет доступа к Application.cfc в любом случае)

Это решение требует возможности создания application.cfc, который не работает для меня (создание одного в myApp ничего не делает, потому что среда, в которой я нахожусь, включает в себя страницу индекса в myApp и создает оттуда ... клиент никогда напрямую не вызывает его для запуска распознавания Application.cfc)

Например:

  • Wwwroot / некоторые / путь / MYAPP / Shared / Base.cfc
  • Wwwroot / некоторые / путь / MYAPP / Функция / Function.cfc

Я ищу возможность вызывать функциональность в Base.cfc (который содержит общие методы, используемые в приложении) из Function.cfc через super и extension.

У меня есть доступ ко всем файлам в myApp, но нет "wwwroot", "some" или "path".

Чтобы расширить Base.cfc в Function.cfc, мне нужно расширить полный путь к «some.path.myApp.Shared.Base». Это может вызвать проблемы, если кто-то переименует папку myApp, поскольку мне придется вручную редактировать. каждый Function.cfc, который расширяет этот Base.cfc

То, что я пытаюсь сделать, это создать специфический «барьер» для приложения, поэтому, если имя папки приложения изменится, это не вызовет массовый хаос, требующий отредактировать все CFC-файлы, которые используют функциональные возможности из Base.cfc.

Поскольку я не могу использовать относительные пути к базе ("..Shared.Base"), мне интересно, есть ли способ создать CFC в папке myApp, из которого я могу расширяться и облегчать переименовывающую головную боль, если это должно было произойти или способ дать ему общее имя, такое как «myApp», и расширить его оттуда. (MyApp.Shared.Base)

У меня нет доступа ни к Application.cfm, ни к администрации Coldfusion.

Ответы [ 5 ]

2 голосов
/ 06 ноября 2010

Лично я бы пошел более простым путем: инкапсулировать Base в функцию.

Похоже, вы хотите использовать набор основных компонентов для некоторых общих функций.Если это так - инкапсуляция еще более применима.

Пути к объектам могут создаваться динамически, например (пошаговый процесс для облегчения чтения):

<cfscript>

    path1 = GetDirectoryFromPath(cgi.SCRIPT_NAME);
    path2 = ListToArray(path1, "/");
    path3 = path2;
    path3[ArrayLen(path3)] = "shared";
    path4 = ArrayToList(path3, ".");
    path5 = ArrayToList(path2, ".");

    myBase = CreateObject("component", "#path4#.Base");

    myFunction = CreateObject("component", "#path5#.Function").init(myBase);

</cfscript>

ВFunction create function init:

<cffunction name="init">
    <cfargument name="base">
    <cfset variables.Base = arguments.base />
    <cfreturn this />
</cffunction>

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

1 голос
/ 11 декабря 2010

Если Base.cfc не расширяет другой cfc, то вы можете включить файл Base.cfc в другой файл cfc в вашей папке функций.

Например, создайте файл cfc в папке функцийс содержанием:

<cfinclude template="../shared/base.cfc" />

Затем расширьте новый файл вместо cfc в общей папке.

0 голосов
/ 13 декабря 2010

Зачем помещать общий код в отдельную папку? Если вы просто поместите его в ту же папку, что и ваши "функции" cfcs, то все они могут расширить его, используя относительный путь.

Так что вместо:

  • Wwwroot / некоторые / путь / MYAPP / Shared / Base.cfc
  • Wwwroot / некоторые / путь / MYAPP / Функция / Function.cfc

Использование:

  • Wwwroot / некоторые / путь / MYAPP / Функция / Base.cfc
  • Wwwroot / некоторые / путь / MYAPP / Функция / Function.cfc

и

<cfcomponent extends="Base"></cfcomponent>

Однако, если у вас есть / нужно несколько папок «функционального» уровня, вы можете сделать что-то подобное. Поместите Proxy.cfc в каждую папку "function" -level, с этим кодом:

<cfcomponent extends="some.path.myApp.shared.Base"></cfcomponent>

И тогда каждый cfc в папках уровня «function» будет расширять свои локальные Proxy.cfc (extends="proxy"). Это дает вам 1 прокси на каждую папку, что все еще не идеально, но меньше хлопот, чем обновление каждого cfc.

0 голосов
/ 08 ноября 2010

Создание кода при запуске / сбросе приложения ...

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

<cfabort>
<cfcomponent extends="{sharedpath}.Base">
...

затем в функции в или вызванной из application.cfc сделать что-то вроде этого ...

<cfdirectory name="codetemplates" action="list" directory="wwwroot/some/path/myApp/codetemplates" />
<cfloop query="codetemplates">
    <cffile name="temp" action="read" path="#tempfilepath##filename#" />
    <cfset newfilecontent = replace(temp.filecontent, '{sharedpath}', configvarwithrightpath) />
    <cfset filecontent = replace(newfilecontent , '<cfabort>', '') />
    <cffile name="temp" action="write" path="#livefilepath##filename#" />
</cfloop>

Другой подход заключается в локальном запуске процесса сборки, который вы запускаете для создания необходимого кода, но мой пример вышепозволяют обновлять переменную конфигурации и обновлять CFC по мере необходимости в реальной среде.

0 голосов
/ 23 октября 2010

Самый простой способ сделать это - создать символическую ссылку или точку соединения с базовым каталогом в каталоге функций расширений.

К сожалению, это не чисто CF-решение и не переносимое, если вам нужнопереместить ваш код.Надеюсь, у кого-то будет лучший ответ, но это может стать запасной точкой, если ничего не будет представлено.

...