首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在ColdFusion中映射到CFC

在ColdFusion中映射到CFC
EN

Stack Overflow用户
提问于 2011-10-19 06:10:04
回答 3查看 15.3K关注 0票数 13

在我的应用程序中,我所有的cfc都在一个cfc文件夹中。在站点根目录中,我可以轻松地访问它们,只需在我的<cfinvoke>标记中将它们引用为component=cfc.mycomponent method=mymethod即可

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

我在这里做错了什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-10-19 07:07:10

有几个选项可以让它工作。不幸的是,学习它们花费了我大量的试验和错误。让我分享一下我学到的东西。

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

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

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

使用web根目录相对路径的缺点是,如果您的应用程序将位于web根目录之外的不同文件夹中,或者将位于子目录中,有时位于web根目录,则web根目录的相对路径将发生变化,从而破坏这些链接。

对于Third,您可以创建特定于应用程序的映射。这是在CF8中引入的,需要您有一个Application.cfc文件。它很容易添加。雷蒙德·卡姆登抓了a great reference语法本质上是这样的。

代码语言:javascript
复制
<cfset this.name = "MyAppName"/>
<cfset this.mappings = structNew() />
<cfset this.mappings["/cfc"] = getDirectoryFromPath(getCurrentTemplatePath()) & "cfc/" />

这种方法唯一的缺点是您的Application.cfc不能在映射的文件夹中扩展CFC。这是一个晦涩难懂的问题,可能不会影响到你。此外,您还需要一个Application.cfc,这是一个很好的实践,但我不知道您是否已经这样做了。

对于第四个,您可以在OnApplicationStart()方法中从前面提到的Application.cfc中将其实例化到您的应用程序范围中。这会将任何编译/实例化时间移到应用程序的第一次命中,并将其从后续命中删除。代码非常简单。

代码语言:javascript
复制
<!--- 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语法很好,但每次从路径调用组件时,都是在重新实例化它,而且这也不是一种非常面向对象的调用组件的方式。思考的食粮,要么接受要么放弃:)

票数 26
EN

Stack Overflow用户

发布于 2011-10-19 06:46:32

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

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

第一种方法是进入您的cfc管理员,进入mappings部分并添加一个指向您的ColdFusion文件夹的/cfc映射。

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

代码语言:javascript
复制
<cfset this.mappings["/cfc"] = GetDirectoryFromPath( GetCurrentTemplatePath() )&"cfc">

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

票数 5
EN

Stack Overflow用户

发布于 2013-02-01 13:11:15

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

ie产品控制器

代码语言:javascript
复制
<cfcomponent displayname="Products" hint="Handles all product requests" extends="core.controller.controller"  output="false">
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7814357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档