您绝对可以使用映射扩展 cfc。我必须自己做。
我在 ColdFusion 中不得不处理的最令人沮丧的事情之一是尝试创建一个对公众开放的外部应用程序,并且必须使用子文件夹中的应用程序来保护该站点的一部分并扩展来自基础 application.cfc 的逻辑。我将向您介绍开发人员用来解决此问题的当前方法,并向您展示如何在可能存在使用虚拟目录的托管服务提供商时额外使用映射。
这是一篇比较长的文章,如果你想跳转到精简摘要,请向下滚动到本页底部。
多年前,我第一次尝试执行此操作时,无论我如何尝试都收到以下消息:“找不到 ColdFusion 组件或接口 xxx'。简而言之, 使用这种方式的问题是根目录和子文件夹都同名,即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,并且我们有 Application.cfc 在“admin”子目录中。
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 模板中使用此“扩展”映射。他们已经可以找到彼此,因为他们都在同一个根目录中。
/Proxy.cfc
概括
为了绝对清楚起见:
root Application.cfc
包含映射逻辑。具有根目录和子目录的映射。
不使用“扩展”语句
root Proxy.cfm
一个简单的 'extends="Administrator" 就可以了。
没有映射逻辑。
子目录 Application.cfc
extends 语句必须是文件夹的映射变量名称 (rootCfc)、一个点 (.),最后是不带 .cfc 前缀的 Proxy.cfc 模板的名称 (Proxy)
我很抱歉如此冗长。写这篇文章的时候我很恼火——但当我试图解决这个问题时却没有那么恼火!
保重!