13

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

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

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

<cfcomponent extends="site.application">

但是,ColdFusion 不喜欢:

<cfcomponent extends="..application">

或任何动态输入,例如:

<cfcomponent extends="#expandpath('..').#application">

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

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

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

4

4 回答 4

16

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

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

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

e.g.
/site1/ApplicationProxy.cfc
/site2/ApplicationProxy.cfc

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

e.g.
/site1/subA/Application.cfc
/site1/subB/Application.cfc
/site2/subA/Application.cfc
于 2008-11-21T00:49:57.020 回答
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>
于 2008-11-21T21:42:32.640 回答
3

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

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

<cfcomponent extends="cms.Application" output="false">
<cfset this.mappings["/cms"] = expandPath(getDirectoryFromPath(getCurrentTemplatePath()) & "../../../../")>
<cflog text="#getMetadata(this).extends.path#">
</cfcomponent>

是的,它感觉有点hacky,但它似乎工作。

于 2010-03-08T16:50:16.250 回答
0

爱德华等人,我在下面的帖子中提到了您的评论。见https://gregoryalexander.com/blog/2021/1/30/Extending-Applicationcfcs-using-mappings-and-proxies

您绝对可以使用映射扩展 cfc。我必须自己做。

我在 ColdFusion 中必须处理的最令人沮丧的事情之一是尝试创建一个对公众开放的外部应用程序,并且必须使用子文件夹中的应用程序来保护该站点的一部分并从基础扩展逻辑应用程序.cfc。我将向您介绍开发人员用来解决此问题的当前方法,并向您展示如何在可能存在使用虚拟目录的托管服务提供商时额外使用映射。

这是一篇相当长的文章,如果您想跳转到精简摘要,请向下滚动到本页底部。

很多年前,我第一次尝试执行此操作时,无论尝试什么都收到以下消息:“找不到 ColdFusion 组件或接口 xxx”。简而言之,使用这种方法的问题是root和子文件夹同名,即Application.cfc,ColdFusion无法正确识别要扩展什么组件,最后经过一番认真的调查,有人想出了一个想法,创建一个proxy.cfc,驻留在同一个目录下根目录作为根 Application.cfc,子文件夹中的 Application.cfc 扩展了一个空的 proxy.cfc,该 proxy.cfc 扩展了根 cfc,如下所示:

根目录:Application.cfc 这个根 Application.cfc 没有扩展任何东西

同样在根目录中: Proxy.cfc Proxy.cfc 有以下代码,它本质上是空的。Proxy.cfc 唯一要做的就是扩展同一目录中的 Application.cfc:

子目录,例如名为 admin 的文件夹。此子目录有另一个 Application.cfc。假设这个组件负责保护应用程序并具有登录逻辑和调试设置等功能。此 Application.cfc 将扩展 Proxy.cfc 以获得根目录中 Application.cfc 的方法和属性,如下所示:

这种方法是天赐之物,并且在博客上广为流传。Ben Nadel 发表了许多非常有用的帖子,我将在本文底部分享这些帖子。

除非您在托管域或使用虚拟目录的服务器上,否则这非常有效。在这种情况下,我们是在我们开始的同一条船上。现在我们又回到了“找不到 ColdFusion 组件或接口 xxx”的地狱!

虽然这个棘手的问题有一个解决方案,但我们还需要使用映射!

不能使用映射来扩展组件是一个常见的误称。我不太确定这种误解最初是从哪里来的,但事实证明这是不正确的。在某些情况下,我们必须使用映射来解决一些烦人的问题,比如这里。

该特定站点由 hostek.com 托管。他们是一家很好的公司,但是由于目录结构,我的网站所在的服务器有一些特点。在这里,当我使用 Proxy.cfc 方法将逻辑从基本 Application.cfc 扩展到管理文件夹中的 Application.cfc 时,我收到可怕的“找不到...组件”错误。当我第一次看到它时,我很沮丧,不再想这个,所以我转向了 ColdFusion CFC 映射。映射告诉 ColdFusion 在哪里可以找到文件以及文件关系是什么。

让我们回顾一下刚才讨论的 CFC 结构。例如,想象以下目录结构:

根目录:即www.gregoryalexander.com/ 子目录:www.gregoryalexander.com/admin/

如前所述,我们在根目录中有 Application.cfc 和 Proxy.cfc,在“admin”子目录中有 Application.cfc。Proxy.cfc 扩展了也在根目录中的 Application.cfc,并且子目录 (admin) 中的 Application.cfc 扩展了根目录中的 Proxy.cfc。

根目录:包含 Application.cfc 和 Proxy.cfc(扩展了根 Application.cfc)。子目录:Application.cfc(扩展 Proxy.cfc)。

现在我们还需要在根 Application.cfc 中添加以下映射。此映射逻辑应靠近根 Application.cfc 的顶部,并且不应位于任何 Application.cfc 事件处理程序(onApplicationStart、onApplicationRequest 等)中。此映射代码不需要位于根 Application.cfc 以外的任何其他位置:

我使用 rootCfc 来识别根目录中的 Application.cfc,而 adminCfc 适用于 admin 目录中的 Application。这些变量可以任意命名。请注意,adminCfc 映射末尾的“/admin”字符串指向“admin”文件夹,该文件夹是一个子目录。

现在我们在根 Application.cfc 中有映射,我们需要将它们应用到位于子目录的 Application.cfc 中的 extends 语句。在 /admin/Application.cfc 模板中使用:

/admin/Application.cfc

当然,rootCfc 告诉子目录中的 Application.cfc 在根目录中查找 Proxy.cfc 模板。与其他“扩展”语句一样,您无需在 Proxy 末尾指定“.cfc”。

您不需要在根 Proxy.cfc 或 Application.cfc 模板中使用此“扩展”映射。他们已经可以找到彼此,因为他们都在同一个根目录中。

/代理.cfc

总结 为了绝对清楚起见: root Application.cfc 包含映射逻辑。具有根目录和子目录的映射。不使用“扩展”语句

root Proxy.cfm 一个简单的 'extends="Administrator" 就可以了。没有映射逻辑。

子目录 Application.cfc extends 语句必须是文件夹的映射变量名称(rootCfc),一个点(.),最后是不带 .cfc 前缀的 Proxy.cfc 模板名称(Proxy)

我很抱歉如此冗长。我在写这篇文章时让自己很恼火——但在我试图解决这个问题时却没有那么恼火!

小心!

于 2021-01-30T12:05:08.790 回答