8

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

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

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

4

3 回答 3

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" ... />
于 2010-03-04T14:33:49.817 回答
6

您可以在这里做几件事。我建议您将组件放在有意义的位置(root/com 或 root/models 或其他),然后从您的应用程序库中引用它们。

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

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

您还可以在 Application.cfm / Application.cfc 中执行一些逻辑来动态查找应用程序的根。此方法不需要特殊权限,如果您将应用程序重新定位到另一个环境,它将起作用。一个快速的谷歌找到了 Peter Freitag 的一篇博客文章,其中包含一个可以做到这一点的功能。如果您使用的是 Application .cfc ,请务必替换.cfmhttp://www.petefreitag.com/item/630.cfm

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

一旦将根路径存储在变量中,事情就会变得容易。

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

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

玩得开心!

于 2010-03-04T14:09:45.910 回答
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 { }等。

于 2010-03-04T14:04:09.580 回答