Edward,等人,我在下面的帖子中提到了你的评论。请参见https://gregoryalexander.com/blog/2021/1/30/Extending-Applicationcfcs-using-mappings-and-proxies
你绝对可以使用映射来扩展cfc。我自己也不得不这样做。
在ColdFusion中,我最让人沮丧的事情之一是尝试创建一个向公众开放的外部应用程序,并需要使用子文件夹中的应用程序来保护该站点的一部分,并从基本application.cfc扩展逻辑。我将向您展示当前开发人员用于解决此问题的方法,以及如何在可能存在虚拟目录的托管提供程序时使用映射。
这是一篇相当长的文章,如果您想跳转到简要摘要,请滚动到本页底部。
很多年前,我第一次尝试执行此操作时,无论我尝试什么,都会收到以下消息:“找不到 ColdFusion 组件或接口 xxx”。简而言之,使用这种方法的问题在于根目录和子文件夹具有相同的名称,即 Application.cfc,ColdFusion 无法正确识别要扩展的组件。最终,在进行了一些严肃的调查后,有人想出了一个主意,即创建一个代理.cfc,它驻留在与根 Application.cfc 相同的根目录中,而子文件夹中的 Application.cfc 扩展了一个空的代理.cfc,该代理.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中的逻辑扩展到admin文件夹中的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 和扩展根 Application.cfc 的 Proxy.cfc。子目录包含扩展 Proxy.cfc 的 Application.cfc。
现在我们还需要在根 Application.cfc 中添加以下映射。这个映射逻辑应该放在根 Application.cfc 的顶部附近,而不应该放在任何 Application.cfc 事件处理程序(onApplicationStart、onApplicationRequest 等)中。这个映射代码不需要出现在除根 Application.cfc 之外的任何其他地方:
我使用 rootCfc 来标识位于根目录中的 Application.cfc,而 adminCfc 适用于 admin 目录中的应用程序。这些变量可以命名为任何名称。请注意,“/admin”字符串指向子目录“admin”,它是一个子目录。
现在我们已经在根Application.cfc中有了映射,我们需要将它们应用于位于子目录中的Application.cfc中的extends语句。在/admin/Application.cfc模板中使用:
/admin/Application.cfc
当然,rootCfc告诉子目录中的Application.cfc在根目录中查找Proxy.cfc模板。与其他“extend”语句一样,您不需要在Proxy末尾指定“.cfc”。
您不需要在根Proxy.cfc或Application.cfc模板中使用此“extend”映射。它们已经可以相互找到,因为它们都在同一个根目录中。
/Proxy.cfc
概述
为了绝对清晰:
root Application.cfc
包含映射逻辑。具有根目录和子目录的映射。
不使用“extend”语句
root Proxy.cfm
一个简单的“extends =“Administrator”即可。
没有映射逻辑。
子目录 Application.cfc
在 extends 语句中,必须使用文件夹的映射变量名(rootCfc),一个点(.),最后是没有 .cfc 前缀的 Proxy.cfc 模板的名称
非常抱歉我写得如此啰嗦。在解决这个问题时我很生气,但没有现在这么生气!
请保重!