在我的应用程序中,我所有的cfc都在一个cfc文件夹中。在站点根目录中,我可以轻松地访问它们,只需在我的<cfinvoke>标记中将它们引用为component=cfc.mycomponent method=mymethod即可
问题是,当我想要从不在根目录中的另一个页面访问cfc时,我无法使用component=../.cfc.mycomponent与该cfc取得联系。
我在这里做错了什么?
发布于 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语法本质上是这样的。
<cfset this.name = "MyAppName"/>
<cfset this.mappings = structNew() />
<cfset this.mappings["/cfc"] = getDirectoryFromPath(getCurrentTemplatePath()) & "cfc/" />这种方法唯一的缺点是您的Application.cfc不能在映射的文件夹中扩展CFC。这是一个晦涩难懂的问题,可能不会影响到你。此外,您还需要一个Application.cfc,这是一个很好的实践,但我不知道您是否已经这样做了。
对于第四个,您可以在OnApplicationStart()方法中从前面提到的Application.cfc中将其实例化到您的应用程序范围中。这会将任何编译/实例化时间移到应用程序的第一次命中,并将其从后续命中删除。代码非常简单。
<!--- 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语法很好,但每次从路径调用组件时,都是在重新实例化它,而且这也不是一种非常面向对象的调用组件的方式。思考的食粮,要么接受要么放弃:)
发布于 2011-10-19 06:46:32
您不能对组件使用相对路径。
您需要的是一个ColdFusion映射。有两种方法可以做到这一点。
第一种方法是进入您的cfc管理员,进入mappings部分并添加一个指向您的ColdFusion文件夹的/cfc映射。
另一种方法是使用特定于应用程序的映射;在应用程序的Application.cfc中,您可以像在ColdFusion管理员映射下那样添加应用程序映射。在应用程序cfc的顶部,添加this.mappings的cfset作为数组。在此数组中,设置与目录路径的映射。
<cfset this.mappings["/cfc"] = GetDirectoryFromPath( GetCurrentTemplatePath() )&"cfc">通过将/cfc映射到您的cfc文件夹,对cfc.objectname的任何组件调用都将加载您的cfc文件夹中的相应组件。
发布于 2013-02-01 13:11:15
如果您的组件扩展了其他组件,请确保使用完整路径。
ie产品控制器
<cfcomponent displayname="Products" hint="Handles all product requests" extends="core.controller.controller" output="false">https://stackoverflow.com/questions/7814357
复制相似问题