如何将CFC存储在单独的目录中并使其工作?

时间:2010-03-04 13:51:51

标签: coldfusion cfc

有没有办法在标签中指定组件路径?

我正在为我的应用程序使用ColdFusion组件。我的应用程序有几个文件夹,每次我想要一个CFC工作时,我必须将它保存在与需要访问的文件相同的目录中。这导致我创建了几个相同的CFC文件。

有没有办法将我的CFC存储在一个目录中并使其在我的网站上运行?

3 个答案:

答案 0 :(得分:10)

正如其他人所说,你可以使用定位应用程序根目录的映射和函数做有趣的事情,但问题的核心是通用路径规范。

我建议您阅读标题为 指定CFC位置 Using ColdFusion Components文档部分。

基本上,它说的是,如果您的应用程序位于http://example.com/myApp/,并且您有http://example.com/myApp/foo/bar/fubar.cfm的页面想要在以下位置使用该组件:

/myApp/foo/components/library/fubar.cfc

然后fubar.cfm应该做这样的事情:

<cfset fubar=createObject("component", "myApp.foo.components.library.fubar") />

您获取文件的路径并用点替换斜杠(也称为“点符号”),并从要加载的组件的文件名中删除“.cfc”。

此外,您可以使用命名映射(如Aaron所述),因此如果您创建一个名为/components的映射,指向/myApp/foo/components/,那么您的createObject调用将如下所示:

<cfset fubar = createObject("component", "components.library.fubar") />

<cfinvoke />中可以使用相同的点符号路径作为component属性的一部分:

<cfinvoke component="components.library.fubar" ... />

答案 1 :(得分:6)

你可以在这做一些事情。我建议你将组件放在合理的位置(root / com,root / models,或其他),然后从你的应用程序库中引用它们。

在ColdFusion管理员中,您可以设置应用程序根目录的映射路径,并从该路径引用组件。

myObject = createObject('component','nameOfMyMapping.models.service.answerStackOverflowQuestions');

您还可以在Application.cfm / Application.cfc中执行某些逻辑,以动态查找应用程序的根目录。此方法不需要特殊权限,并且如果您将应用程序重定位到另一个环境,则该方法将起作用。一个快速的谷歌出现了由Peter Freitag撰写的一篇博文,其功能就是这样做的。如果您使用的是应用 .cfc ,请务必更换 .cfm http://www.petefreitag.com/item/630.cfm

CFLib.org也有一个方法,看起来它会为你找到根路径。 http://www.cflib.org/udf/GetRootPath

将根路径存储在变量中后,事情就变得容易了。

myObject = createObject('component','#myRoot#.models.service.answerStackOverflowQuestions');

最后,许多框架已经使这个,以及许多其他常见的,非常简单。您可以选择任何ColdFusion框架。有人已经发明了轮子;)。

玩得开心!

答案 2 :(得分:4)

对于ColdFusion 9

文件系统

/
  lib/
    DataAccess.cfc
    IndexingService.cfc
  app/
    Application.cfc
    index.cfm

档案:/app/Application.cfc

component {
  root = goUpDirectory(2, GetCurrentTemplatePath());
  This.mappings["/lib"] = "#root#/lib";
  This.mappings["/app"] = "#root#/app";

  function goUpDirectory(levels, path) {
    for(levels = levels; levels >= 1; levels -= 1) {
      path = GetDirectoryFromPath(path);
      path = Left(path, Len(path) - 1);
    }
    return path;
  }
}

档案:/app/controllers/UsersController.cfc

component {
  ...
  da = new lib.DataAccess();
  ...
}

对于ColdFusion 8

与上述相同,仅使用CreateObject代替new<cfcomponent />代替component { }等。