在 Coldfusion 中,如何初始化位于当前路径文件夹上方的组件?
Posted
技术标签:
【中文标题】在 Coldfusion 中,如何初始化位于当前路径文件夹上方的组件?【英文标题】:In Coldfusion, how do I init a component that is located above the current path folder? 【发布时间】:2011-02-01 07:38:31 【问题描述】:如果我的文件夹结构如下所示:
/
/bin/myComponent.cfc
/reports/index.cfm
如何从 index.cfm 启动 myComponent.cfc?
myService = createObject("component", "bin.myComponent");
使用点语法,我知道如何进入更深的文件夹,但我该如何上一个文件夹,然后下到另一个文件夹?使用斜线语法会是这样的:
../bin/myComponent.cfc
但是 createObject() 不是这样工作的。我想保留一个相对路径,这样我就可以在不破坏路径的情况下将此文件夹移动到另一台服务器。
想法?谢谢!
编辑:
我的示例没有为你们提供的创造性答案显示足够深的文件夹结构。这是我应该做的:
/[my project folder]/
/[my project folder]/bin/myComponent.cfc
/[my project folder]/reports/index.cfm
我的基本问题是,如果 [我的项目文件夹] 的名称不是静态的,是否可以在使用 createObject("component","dot path") 从 index.cfm 到 myComponent.cfc项目的所有安装。
如果答案是否定的,那么我只需要弄清楚最佳实践是什么,无论是映射还是应用程序设置。
【问题讨论】:
【参考方案1】:我们使用 cf 管理员中的映射来处理此问题。通常所有的组件都放在一个位于 www 根目录之上的目录中。在您的情况下,您可以向 / 添加一个映射,这将允许您执行以下操作:
myService = createObject("component", "mymapping.bin.myComponent");
【讨论】:
虽然我喜欢上面的方法,但因为我有管理员访问权限,所以更简洁。 我在他的文本中有一个带点的文件夹,如何从 createObject 添加路径? (例如:board.models),我无法更改路径名【参考方案2】:如果您的文件夹结构的根目录中有 Application.cfc,您可以使用如下内容:
<cfset this.mappings["/local"] = getDirectoryFromPath(getCurrentTemplatePath()) />
然后通过“local.bin.myComponent”访问
【讨论】:
这可能会奏效。我假设我在 application.cfc 中使用此代码?从那时起,我用 #application.mappings["/local"]? 引用它 它的工作方式与您在 CF Administrator 中设置映射的方式相同。您可以将文件引用为 /local/bin/somefile.cfm 或将组件引用为 local.bin.myComponent(如上面的 intnick 所示)【参考方案3】:这是艰难的一周的结束,因此很可能可以通过某种方式增强以下代码,但通常这种方法应该有效:
<cfscript>
// this script is here http://XXXXXXX/test/paths/relative/reports/index.cfm
// component is here http://XXXXXXX/test/paths/relative/bin/myComponent.cfc
local = ;
// initialize with dynamic mapping
local.myComponentDynamic = createObject("component", "/bin/myComponent");
// grab the current directory name
local.parentPathExpanded = ExpandPath("../");
local.scriptPathExpanded = ExpandPath(cgi.SCRIPT_NAME);
local.thisDirectory = GetDirectoryFromPath(Replace(local.scriptPathExpanded, local.parentPathExpanded, ""));
// build base path
local.scriptPathDirectory = GetDirectoryFromPath(cgi.SCRIPT_NAME);
local.basePath = Replace(local.scriptPathDirectory, local.thisDirectory, "");
// this is relative path we already know
local.relativePath = "bin/myComponent";
// initialize with slash-syntax (path starting with /)
local.myComponentSlash = createObject("component", local.basePath & local.relativePath);
// convert path to the dot-syntax
local.dottedPath = Replace(local.basePath & local.relativePath, "/", ".", "ALL");
local.dottedPath = Right(local.dottedPath, Len(local.dottedPath)-1);
// initialize with dot-syntax path
local.myComponentDot = createObject("component", local.dottedPath);
</cfscript>
<cfdump var="#local#">
为了便于阅读和理解这个示例,我将进程拆分为单独的变量并转储了公共容器。
但无论如何,如果您可以在 Application.cfc 中使用动态映射,请使用它。
编辑:我已经添加了这样的示例,假设您在父文件夹中有以下 Application.cfc(例如,如果从 index.cfm 中查看,则为“../Application.cfc”):
<cfcomponent output="false">
<cfset this.mappings["/bin"] = getDirectoryFromPath(getCurrentTemplatePath()) & "bin/" />
</cfcomponent>
我的“路径转换”示例只是一个有趣的技巧和玩代码,这对于好的应用程序来说并不是真正简单的方法。
【讨论】:
我真的很喜欢这个例子,因为在周五晚些时候开箱即用。 :-) 但是,我同意你的看法:我需要将映射放在我的应用程序文件中。我很惊讶在路径更深处创建对象是如此容易,但不是更高。谢谢!【参考方案4】:只使用根目录的完整路径
<cfset obj = createObject("component", "bin.cart.item")>
item.cfc 位于 [网站根目录]/lib/cart/ - 这将在您的代码中的任何位置起作用。
【讨论】:
问题是我不知道网站根文件夹名称,可以将网站安装到不同名称的文件夹中。从该文件夹中,所有内容都位于相对于彼此的已知位置。我需要能够以编程方式确定该文件夹名称。 你不需要知道网站根目录的名字,只要/bin就在根目录下即可。例如,如果您的网站位于 c:/inetpub/example.com/webroot/,那么您可以使用上面的 createObject 实例化位于 c:/inetpub/example.com/webroot/bin/ 中的 cfc。现在我意识到你所有的 cfc 都不在 webroot 文件夹下,在这种情况下我的解决方案将不起作用。对吗? 我相信我在示例中使用文件夹名称“bin”引起了混淆。在实际实践中,它只是一个存放与该项目相关的所有 cfc 的文件夹。它不位于 webroot 中。此服务器上的项目都与其他项目分开。【参考方案5】:我遇到了同样的问题,这是我的解决方案。这很简单,但花了几个小时才打到我。希望这可以节省一些时间。
我从
开始<bean id="ColdBooksConnectionService" class="myservice.model.service.ConnectionService" />
总是报不可用的错误,所以我写出了完整路径
<bean id="ColdBooksConnectionService" class="/CFIDE.administrator.myservice.model.service.ConnectionService" />
问题就解决了。
希望这会有所帮助。
【讨论】:
【参考方案6】:将 cfobject 放在与 .cfc 相同目录下的 include.cfm 文件中,然后您可以使用 <cfinclude template="..\Whatever\include.cfm" />
调用
【讨论】:
以上是关于在 Coldfusion 中,如何初始化位于当前路径文件夹上方的组件?的主要内容,如果未能解决你的问题,请参考以下文章
当我们在ColdFusion中使用API 调用(POST请求)将参数数量传递给服务器时,如何修复“POST请求超出”错误?
如何让Coldfusion 10在Windows 10中与IIS 10一起使用
为啥当我在 cfoutput 中调用函数时,ColdFusion 会添加空格?