Расширение application.cfc в подкаталоге
У меня есть следующие два файла и хотелось бы, чтобы второй расширил первый:
- Wwwroot\сайт\Application.cfc
- Wwwroot\сайт\реж\Application.cfc
Однако, когда я перехожу к объявлению компонента для второго файла, я не уверен, что добавить в атрибут extends. Моя проблема заключается в том, что несколько сайтов-разработчиков (с общим хранилищем SVN) работают с одним и тем же экземпляром ColdFusion, поэтому я не могу просто создать сопоставление в CF-администрировании так:
<cfcomponent extends="site.application">
Однако ColdFusion не нравится:
<cfcomponent extends="..application">
или любой динамический ввод, например:
<cfcomponent extends="#expandpath('..').#application">
Создание сопоставления времени выполнения (как здесь) тоже не представляется возможным. Создание его в базовом приложении .cfc бесполезно, потому что этот код еще не выполнен к моменту объявления наследования cfc; и я не могу создать сопоставление до определения наследующего компонента, потому что еще нет приложения для его присоединения.
Есть ли способ ссылаться на родительский каталог для выполнения моих расширений?
Изменить, чтобы уточнить: решение ApplicationProxy не работает из-за выделенного полужирным шрифтом. Прямо сейчас, в качестве обходного пути, мы просто не проверяем \dir\application.cfc в SVN, чтобы каждый разработчик мог сохранить версию, которая расширяет его собственный root application.cfc. Очевидно, это не идеально.
Ответы
Ответ 1
Для меня работает следующий код. Одна вещь, которую я заметил, это то, что application.cfc, похоже, кэшируется, поэтому изменения в родительском приложении cfc могут не отображаться. Я обошел это, выполнив тривиальное изменение дочернего приложения cfc.
<cfcomponent output="false">
<cfset variables.higherPath = ReReplace(GetMetaData(this).name,"\.[^\.]+\.[^\.]+$","") />
<cfset variables.extendApp = CreateObject("component", "#variables.higherPath#.Application") />
<cfloop item="variables.key" collection="#variables.extendApp#">
<cfif IsCustomFunction(variables.extendApp[variables.key])>
<cfset super[variables.key] = variables.extendApp[variables.key]>
<cfelse>
<cfset this[variables.key] = variables.extendApp[variables.key] >
</cfif>
</cfloop>
<cffunction name="onApplicationStart" output="false">
<cfset super.onApplicationStart() />
</cffunction>
Ответ 2
Sean Corfield имеет запись в блоге, в которой объясняется, как расширить корневой файл Application.cfc.
Ниже приведена соответствующая информация, скопированная из этой записи.
Здесь ваш корень CFC/Application.cfc:
<cfcomponent>
<cfset this.name = "cf7app" />
<cfset this.sessionmanagement = true />
</cfcomponent>
Здесь ваш прокси CFC/ApplicationProxy.cfc:
<cfcomponent extends="Application">
</cfcomponent>
Он полностью пуст и служит только для создания псевдонима для вашего корня /Application.cfc. Здесь ваш подкаталог CFC/app/Application.cfc:
<cfcomponent extends="ApplicationProxy">
<cffunction name="onSessionStart">
<cfoutput><p>app.Application.onSessionStart()</p></cfoutput>
<cfset session.counter = 0 />
</cffunction>
<cffunction name="onRequestStart">
<cfoutput><p>app.Application.onRequestStart()</p></cfoutput>
<cfdump label="application" var="#application#"/>
</cffunction>
</cfcomponent>
Корень каждого отдельного сайта должен иметь свое собственное приложение-мастер:
/site1/Application.cfc
/site2/Application.cfc
/site3/Application.cfc
Все эти приложения представляют собой отдельные индивидуальные приложения, в которых нет ничего общего между ними.
Если какой-либо из этих отдельных сайтов должен иметь под-приложения, тогда должен быть ApplicationProxy.cfc отдельно от мастера,
e.g.
/site1/ApplicationProxy.cfc
/site2/ApplicationProxy.cfc
Затем для каждого подзадача у вас есть тот, который расширяет прокси-сервер:
e.g.
/site1/subA/Application.cfc
/site1/subB/Application.cfc
/site2/subA/Application.cfc
Ответ 3
Я знаю, что это старая тема, но я нашел способ сделать это (это, похоже, работает в моем тестировании) без использования сопоставлений CF-администратора.
Вы можете сделать это, добавив сопоставление каждого приложения в дочернем приложении Application.cfc с использованием расширенного относительного пути:
<cfcomponent extends="cms.Application" output="false">
<cfset this.mappings["/cms"] = expandPath(getDirectoryFromPath(getCurrentTemplatePath()) & "../../../../")>
<cflog text="#getMetadata(this).extends.path#">
</cfcomponent>
Да, он немного взломан, но, похоже, он работает.