映射到ColdFusion中的CFC

Ofe*_*all 12 mapping coldfusion cfc

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

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

我在这做错了什么?

Nat*_*utz 25

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

首先,您可以使用在CF管理员中创建映射的经典方法.指定组件的确切路径(例如c:\wwwroot\cfc),以及要通过它调用它的映射(伪文件夹)(例如MyCFCs).现在,在应用程序的任何地方,你可以参考一下创建一个new MyCFCs.mycomponent()(使用的CF9 + new关键字,您可以替代的CreateObject('组件’,'MyCFCs.mycomponent’)是兼容的回CF6).

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

其次,你可以从一个网站根目录的相对路径引用您的氟氯化碳,也就是说,如果您的应用程序在你的服务器的根目录和/cfc路径是直接从Web根目录的,你总是可以做到new cfc.mycomponent()从任何地方在你的应用程序.ColdFusion 6.1及更高版本将正确映射到您网站的根目录.这就像使用/images/mypicture.jpg网站中的任何位置引用图像一样,/images将直接进入同一目录.

使用Web根目录相对路径的缺点是,如果您的应用程序将永远是在不同的文件夹断Web根目录,或将永远成为一个子目录,有时会在Web根目录,从网页的相对路径root会改变,打破这些链接.

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

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

此方法的唯一缺点是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() />
Run Code Online (Sandbox Code Playgroud)

这样做的缺点之一是,一旦你的组件是在应用程序的内存,你做它,而你正在开发应用程序的任何更改将不会反映,直到您清空应用内存或()再次调用onApplicationStart.这并不难解决,但它只是更多的代码,更多的是管理.

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

  • 非常简单的细节和有用的描述.谢谢. (3认同)
  • 只是想报告这个.我已经实现了选项3,它的作用很有名.再次感谢你. (2认同)

Ste*_*tti 5

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

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

第一个是进入ColdFusion管理员,进入映射部分并添加指向cfc文件夹的/ cfc映射.

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

<cfset this.mappings["/cfc"] = GetDirectoryFromPath( GetCurrentTemplatePath() )&"cfc">
Run Code Online (Sandbox Code Playgroud)

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