映射到ColdFusion中的CFC

映射到ColdFusion中的CFC,coldfusion,mapping,cfc,Coldfusion,Mapping,Cfc,在我的应用程序中,我的所有CFC都在CFC文件夹中。从站点根目录中,我只需在我的标记中将它们称为component=cfc.mycomponent method=mymethod 问题是,当我想从另一个不在根目录中的页面访问cfc时,我无法使用component=...cfc.mycomponent与该cfc取得联系 我做错了什么?您不能对组件使用相对路径 您需要的是ColdFusion映射。有两种方法可以做到这一点 首先,进入ColdFusion管理员,进入映射部分,添加指向cfc文件夹的/c

在我的应用程序中,我的所有CFC都在CFC文件夹中。从站点根目录中,我只需在我的
标记中将它们称为
component=cfc.mycomponent method=mymethod

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


我做错了什么?

您不能对组件使用相对路径

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

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

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

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


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

有几个选项可以实现此功能。不幸的是,学习它们花费了我大量的尝试和错误。让我分享我学到的东西

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

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

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

使用web根相对路径的缺点是,如果应用程序位于web根以外的其他文件夹中,或者位于子目录中,有时位于web根,则web根的相对路径将发生更改,从而断开这些链接

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

<cfset this.name = "MyAppName"/>
<cfset this.mappings = structNew() />
<cfset this.mappings["/cfc"] = getDirectoryFromPath(getCurrentTemplatePath()) & "cfc/" />
这种方法的缺点是,一旦组件位于应用程序内存中,在开发应用程序时对其所做的任何更改都不会反映出来,除非您清除应用程序内存或再次调用ApplicationStart()。四处走动并不难,但这只是更多的代码,更多的管理


最后一个注意事项,您可能需要考虑从
移动到
createObject(“组件”,…)
,或者,如果您使用的是CF9,
new
。cfinvoke语法很好,但是每次从路径调用组件时,都是在重新实例化它,而且调用组件也不是一种非常面向对象的方式。值得深思的是,要么接受,要么放弃:)

确保如果您的组件扩展了其他组件,则使用完整路径

ie a产品控制器

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

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

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

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

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

根目录:Application.cfc
此root Application.cfc不扩展任何内容

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




子目录,例如名为admin的文件夹。
此子目录有另一个Application.cfc。L
<cfcomponent displayname="Products" hint="Handles all product requests" extends="core.controller.controller"  output="false">