映射到ColdFusion中的CFC

时间:2011-10-18 22:10:04

标签: coldfusion mapping cfc

在我的应用程序中,我将所有CFC都放在cfc文件夹中。从网站根目录开始,我可以毫不费力地访问它们,只需在<cfinvoke>标记中将其引用为component=cfc.mycomponent method=mymethod

问题是,当我想从另一个不在根目录中的页面访问cfc时,我无法使用component=../.cfc.mycomponent与该cfc取得联系。

我在这里做错了什么?

4 个答案:

答案 0 :(得分:25)

有一些选项可以让它发挥作用。不幸的是,学习它们给我带来了大量的反复试验。让我分享一下我学到的东西。

首先,您可以使用在CF管理员中创建映射的经典方法。指定组件的确切路径(例如c:\wwwroot\cfc),以及要通过其调用的映射(伪文件夹)(例如MyCFCs)。现在,从应用程序的任何位置,您都可以引用创建new MyCFCs.mycomponent()(使用CF9 +的new关键字,您可以替换createObject(“component”,“MyCFCs.mycomponent”)以兼容CF6) 。

使用服务器映射的缺点是您必须在运行应用程序的每台服务器上配置它。我通常有一个本地开发服务器,它与我的生产服务器的配置完全不同,在生产服务器上进行更改对我来说很难,所以我尽量避免使用服务器映射。

第二,您可以从Web根目录相对路径引用您的CFC,这意味着如果您的应用程序位于服务器的根目录中,并且/cfc路径直接位于在Web根目录中,您始终可以从应用程序的任何位置执行new cfc.mycomponent()。 ColdFusion 6.1及更高版本将正确映射到您网站的根目录。这就像使用/images/mypicture.jpg引用图片一样,在您网站的任何位置,/images将直接转到同一目录。

使用web-root-relative路径的缺点是,如果您的应用程序将位于Web根目录之外的其他文件夹中,或者将永远位于子目录中,有时位于Web根目录,则相对路径从网络根目录将改变,打破这些链接。

第三次,您可以创建特定于应用程序的映射。这是在CF8中引入的,要求您拥有Application.cfc文件。添加起来很简单。雷蒙德·卡姆登有a great reference。语法基本上就是这样。

<cfset this.name = "MyAppName"/>
<cfset this.mappings = structNew() />
<cfset this.mappings["/cfc"] = getDirectoryFromPath(getCurrentTemplatePath()) & "cfc/" />

此方法的唯一缺点是Application.cfc无法在映射文件夹中扩展CFC。这是一个不起眼的问题,可能不会影响你。此外,你需要一个Application.cfc,这是一个很好的做法,但我不知道你是否这样做。

第四,您可以将CFC实例化到您的应用程序范围内,可能来自上述Application.cfc中的OnApplicationStart()方法。这会将任何编译/实例化时间移动到应用程序的第一次命中,并将其从后续命中中移除。代码非常简单。

<!--- from Application.cfc, inside onApplicationStart() --->
<cfset application.myComponent = new cfc.myComponent() />

<!--- from anywhere else in your application --->
<cfset application.myComponent.callMyMethod() />

这个问题的缺点是,一旦你的组件在应用程序内存中,在你开发应用程序时对它所做的任何更改都不会反映出来,直到你清除应用程序内存或再次调用onApplicationStart()。这并不难解决,但它只是更多的代码,更多的是管理。

最后一个注释,您可能需要考虑从<cfinvoke>转移到createObject("component",...),或者如果您使用的是CF9 new。 cfinvoke语法很好,但是每次从路径调用组件时,都会重新实例化它,而且它也不是一种非常面向对象的方法来调用组件。值得思考,接受或离开它:)

答案 1 :(得分:5)

您不能将相对路径与组件一起使用。

您需要的是ColdFusion映射。有两种方法可以做到这一点。

首先是进入ColdFusion管理员,进入映射部分并添加指向cfc文件夹的/ cfc映射。

另一种方法是使用特定于应用程序的映射; 在应用程序的Application.cfc中,您可以像在ColdFusion管理员映射下一样添加应用程序映射。在应用程序的顶部cfc将this.mappings的cfset添加为数组。在此数组中,使用目录路径设置映射。

<cfset this.mappings["/cfc"] = GetDirectoryFromPath( GetCurrentTemplatePath() )&"cfc">

将/ cfc映射到cfc文件夹,对cfc.objectname的任何组件调用都会在cfc文件夹中加载相应的组件。

答案 2 :(得分:1)

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

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

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

多年前,当我第一次尝试执行此操作时,无论尝试什么,我都收到以下消息:“找不到 ColdFusion 组件或接口 xxx'。简而言之,使用这种方法的问题是根文件夹和子文件夹同名,即Application.cfc,ColdFusion无法正确识别扩展哪个组件。最后,经过一番认真的调查,有人想出了这个想法创建一个与根 Application.cfc 位于同一根目录中的 proxy.cfc,子文件夹中的 Application.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 扩展到 admin 文件夹中的 Application.cfc 时,我收到可怕的“找不到...组件”错误。当我第一次看到它时,我很沮丧,再次想到它,所以我转向了 ColdFusion CFC 映射。映射告诉 ColdFusion 在哪里可以找到文件以及文件关系是什么。

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

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

如前所述,我们在根目录中有一个Application.cfcProxy.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 目录中的应用程序。这些变量可以任意命名。请注意,adminCfc 映射末尾的“/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 模板中使用此“扩展”映射。他们已经可以找到对方了,因为他们都在同一个根目录下。

/Proxy.cfc

概括

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



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

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

我很抱歉这么冗长。写这篇文章的时候我很恼火——但我在尝试解决这个问题时并没有那么恼火!

保重!

答案 3 :(得分:0)

确保您的组件扩展其他组件是否使用了完整路径。

即产品控制器

<cfcomponent displayname="Products" hint="Handles all product requests" extends="core.controller.controller"  output="false">