首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在子目录中扩展application.cfc

在子目录中扩展application.cfc
EN

Stack Overflow用户
提问于 2008-11-21 00:41:28
回答 4查看 6.9K关注 0票数 13

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

  1. wwwroot\site\application.cfc
  2. wwwroot\site\dir\application.cfc

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

代码语言:javascript
复制
<cfcomponent extends="site.application">

但是,ColdFusion不喜欢:

代码语言:javascript
复制
<cfcomponent extends="..application">

或任何动态输入,如:

代码语言:javascript
复制
<cfcomponent extends="#expandpath('..').#application">

创建运行时映射(就像这里)似乎也是不可能的。在基本application.cfc中创建它是无用的,因为在声明继承cfc时,该代码还没有执行;而且在定义继承组件之前,我无法创建映射,因为还没有一个应用程序可以将它附加到。

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

编辑以澄清:由于上面的粗体文本,ApplicationProxy解决方案无法工作。现在,作为一种解决办法,我们根本没有将\dir\application.cfc签入SVN,这样每个开发人员都可以保留一个扩展自己的根application.cfc的版本。显然,这并不理想。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2008-11-21 21:42:32

下面的代码适用于我。不过,我注意到的一件事是,application.cfc似乎被缓存了,因此对父应用程序cfc的更改可能不会得到反映。我通过对子应用程序cfc做一个简单的更改来解决这个问题。

代码语言:javascript
复制
<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>
票数 4
EN

Stack Overflow用户

发布于 2008-11-21 00:49:57

肖恩·科菲尔德( Sean ) 解释如何扩展根Application.cfc的博客条目报道。

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

这里是您的根CFC /Application.cfc:

代码语言:javascript
复制
<cfcomponent>

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

</cfcomponent>

下面是您的代理CFC /ApplicationProxy.cfc:

代码语言:javascript
复制
<cfcomponent extends="Application">
</cfcomponent>

它完全是空的,只用于为根/Application.cfc创建别名。下面是您的子目录CFC /app/Application.cfc:

代码语言:javascript
复制
<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>

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

代码语言:javascript
复制
/site1/Application.cfc
/site2/Application.cfc
/site3/Application.cfc

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

如果这些站点中的任何一个需要有子应用程序,那么就应该有ApplicationProxy.cfc在主服务器旁边,

代码语言:javascript
复制
e.g.
/site1/ApplicationProxy.cfc
/site2/ApplicationProxy.cfc

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

代码语言:javascript
复制
e.g.
/site1/subA/Application.cfc
/site1/subB/Application.cfc
/site2/subA/Application.cfc
票数 16
EN

Stack Overflow用户

发布于 2010-03-08 16:50:16

我知道这是个老生常谈的话题,但我找到了一种不使用CF管理员映射的方法(这似乎在我的测试中起作用)。

可以通过使用扩展的相对路径在子Application.cfc中添加每个应用程序映射来做到这一点:

代码语言:javascript
复制
<cfcomponent extends="cms.Application" output="false">
<cfset this.mappings["/cms"] = expandPath(getDirectoryFromPath(getCurrentTemplatePath()) & "../../../../")>
<cflog text="#getMetadata(this).extends.path#">
</cfcomponent>

是啊,感觉有点烦躁,但看起来挺管用的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/307423

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档