将application.cfc扩展到子目录中

Sol*_*nal 13 coldfusion cfc application.cfc

我有以下两个文件,并希望第二个扩展第一个:

  1. wwwroot的\网站\的Application.cfc
  2. wwwroot的\网站\目录\的Application.cfc

但是,当我为第二个文件声明组件时,我不确定要在extends属性中放入什么. 我的问题是几个开发站点(有一个共享的SVN存储库)正在运行ColdFusion的同一个实例,所以我不能像这样在CF管理员中创建一个映射:

<cfcomponent extends="site.application">
Run Code Online (Sandbox Code Playgroud)

但是,ColdFusion不喜欢:

<cfcomponent extends="..application">
Run Code Online (Sandbox Code Playgroud)

或任何动态输入,如:

<cfcomponent extends="#expandpath('..').#application">
Run Code Online (Sandbox Code Playgroud)

创建运行时映射(如此处)似乎也不可行.在基础application.cfc中创建它是没用的,因为在声明继承cfc时该代码尚未执行; 并且我无法在定义继承组件之前创建映射,因为还没有应用程序将其附加到.

有什么方法可以引用父目录来完成我的扩展吗?

编辑以澄清:由于上面的粗体文本,ApplicationProxy解决方案不起作用.现在,作为一种解决方法,我们只是不将\ dir\application.cfc检查到SVN,以便每个开发人员都可以保留一个扩展他/她自己的根application.cfc的版本.显然,这并不理想.

Pet*_*ton 16

Sean Corfield有一篇博客文章,解释了如何扩展根Application.cfc.

以下是从该条目复制的相关信息.


这是您的根CFC /Application.cfc:

<cfcomponent>

    <cfset this.name = "cf7app" />
    <cfset this.sessionmanagement = true />

</cfcomponent>
Run Code Online (Sandbox Code Playgroud)

这是您的代理CFC /ApplicationProxy.cfc:

<cfcomponent extends="Application">
</cfcomponent>
Run Code Online (Sandbox Code Playgroud)

它完全是空的,仅用于为您的根/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>
Run Code Online (Sandbox Code Playgroud)

每个站点的根应该有自己的主应用程序:

/site1/Application.cfc
/site2/Application.cfc
/site3/Application.cfc
Run Code Online (Sandbox Code Playgroud)

所有这些应用程序都是单独的应用程序,它们之间没有共享

如果这些单独的站点中的任何一个需要具有子应用程序,那么应该有MasterProxy.cfc,

e.g.
/site1/ApplicationProxy.cfc
/site2/ApplicationProxy.cfc
Run Code Online (Sandbox Code Playgroud)

然后,对于每个子应用程序,您具有扩展代理的应用程序:

e.g.
/site1/subA/Application.cfc
/site1/subB/Application.cfc
/site2/subA/Application.cfc
Run Code Online (Sandbox Code Playgroud)


Luc*_*ers 4

以下代码对我有用。但我注意到的一件事是 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>
Run Code Online (Sandbox Code Playgroud)