在我的应用程序中,我将所有的CFC放在一个cfc文件夹中。从网站根目录,我可以通过在我的标签中简单地引用它们来访问它们,如component=cfc.mycomponent method=mymethod
。
问题是,当我想从另一个不在根目录下的页面访问cfc时,我无法使用component=../.cfc.mycomponent
来联系那个cfc。
这里我的做法有什么问题吗?
在我的应用程序中,我将所有的CFC放在一个cfc文件夹中。从网站根目录,我可以通过在我的标签中简单地引用它们来访问它们,如component=cfc.mycomponent method=mymethod
。
问题是,当我想从另一个不在根目录下的页面访问cfc时,我无法使用component=../.cfc.mycomponent
来联系那个cfc。
这里我的做法有什么问题吗?
有几种选项可供实现这个目标。不幸的是,我通过大量的试错才学会了它们。让我分享一下我所学到的。
首先,您可以使用在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根目录的相对路径的缺点是,如果您的应用程序将在Web根目录之外的不同文件夹中,或者有时在子目录中并且有时在Web根目录中,则来自Web根目录的相对路径将发生变化,从而破坏这些链接。
第三,您可以创建一个应用程序特定的映射。这在CF8中引入,并要求您拥有一个Application.cfc
文件。添加它很简单。Raymond Camden有一个很好的参考资料。其语法本质上类似于此。
<cfset this.name = "MyAppName"/>
<cfset this.mappings = structNew() />
<cfset this.mappings["/cfc"] = getDirectoryFromPath(getCurrentTemplatePath()) & "cfc/" />
这种方法的唯一缺点是您的Application.cfc无法扩展映射文件夹中的CFC。这是一个不太常见的问题,可能不会影响您。此外,您需要有一个Application.cfc,这是一个好的实践方法,但我不知道您是否已经做到了。<!--- from Application.cfc, inside onApplicationStart() --->
<cfset application.myComponent = new cfc.myComponent() />
<!--- from anywhere else in your application --->
<cfset application.myComponent.callMyMethod() />
这种方法的缺点是,一旦你的组件在应用内存中,当你开发应用程序时对它所做的任何更改都不会反映出来,除非你清除应用程序内存或再次调用onApplicationStart()。解决起来并不难,但这需要编写更多的代码并进行更多的管理。<cfset application.imagePath = replace(expandPath("images/"), expandPath("."), "") />
然后将其引用为 #application.imagePath#/myPhoto.jpg
- 我没有测试过,但您可以理解这个想法。 - Nathan Strutz<cfset this.mappings["/cfc"] = GetDirectoryFromPath( GetCurrentTemplatePath() )&"cfc">
<cfset this.mappings["/cfc"] = ...
- 你忘记了 "s"。 - Seybsen根目录: Application.cfc
这个根Application.cfc 没有继承任何东西
同样在根目录下:Proxy.cfc
Proxy.cfc有以下代码,它是基本上为空的。 唯一 Proxy.cfc 做的事情就是扩展与其在同一目录中的 Application.cfc:
<cfcomponent extends="Application">
</cfcomponent>
子目录 比如一个名为admin的文件夹。
这个子目录里有另一个Application.cfc。假设这个组件负责保护应用程序并具有登录逻辑以及调试设置等功能。 这个Application.cfc 将扩展Proxy.cfc以获取根目录中的Application.cfc的方法和属性,如下所示:
<cfcomponent displayname="Admin" extends="Proxy.cfc">
让我们回顾刚刚讨论的CFC结构。例如,想象以下目录结构:
根目录:即www.gregoryalexander.com/
子目录:www.gregoryalexander.com/admin/
根目录:包含Application.cfc和扩展根Application.cfc的Proxy.cfc。
子目录:Application.cfc(扩展Proxy.cfc)。
现在我们还需要在根Application.cfc中添加以下映射。此映射逻辑应位于根Application.cfc顶部附近,并且不应位于任何Application.cfc事件处理程序(onApplicationStart、onApplicationRequest等)内部。此映射代码除了根Application.cfc外不需要出现在任何其他地方:
<cfset this.mappings = structNew() />
<cfset this.mappings["rootCfc"] = getDirectoryFromPath(getCurrentTemplatePath()) />
<cfset this.mappings["adminCfc"] = getDirectoryFromPath( getCurrentTemplatePath() & "/admin" ) />
我使用了 rootCfc 来标识位于根目录中的 Application.cfc,而 adminCfc 则适用于位于 admin 目录中的 Application.cfc。这些变量可以随意命名。请注意,adminCfc 映射的末尾包含字符串 "/admin",该字符串指向 'admin' 子目录。
既然我们在根 Application.cfc 中拥有了这些映射,我们需要将其应用到位于子目录中的 Application.cfc 中的 extends 语句中。在 /admin/Application.cfc 模板中使用:
/admin/Application.cfc
<cfcomponent displayname="xxx" sessionmanagement="xx" clientmanagement="xx" extends="rootCfc.Proxy">
当然,rootCfc 告诉子目录中的 Application.cfc 在根目录中查找 Proxy.cfc 模板。与其他 'extend' 语句一样,在 Proxy 的末尾不需要指定 '.cfc'。
您不需要在根目录下的Proxy.cfc或Application.cfc模板中使用此“extend”映射。它们已经可以相互找到,因为它们都在同一个根目录中。
/Proxy.cfc
<cfcomponent extends="Application">
</cfcomponent>
为了绝对清晰:
根Application.cfc
包含映射逻辑。具有根目录和子目录的映射。
不使用'extend'语句
<cfset this.mappings = structNew() />
<cfset this.mappings["rootCfc"] = getDirectoryFromPath(getCurrentTemplatePath()) />
<cfset this.mappings["adminCfc"] = getDirectoryFromPath( getCurrentTemplatePath() & "/admin" ) />
根Proxy.cfm
一个简单的“extends =”Administrator“即可。
没有映射逻辑。
<cfcomponent extends="Application"> </cfcomponent>
子目录 Application.cfc请确保您的组件扩展其他组件时使用完整路径。
例如,一个产品控制器
<cfcomponent displayname="Products" hint="Handles all product requests" extends="core.controller.controller" output="false">
root.cfc.mycomponent
。 - Leigh