6

我已经看到了在父文件夹中扩展 cfcs 的各种解决方案,可以访问父文件或 CF 管理,但我还没有看到在“共享”/兄弟文件夹中扩展 cfc 而不访问父文件夹的可行解决方案。

此解决方案需要访问父文件夹吗?(不确定这些映射是什么,但无论如何我都无法访问 Application.cfc)

此解决方案需要能够创建一个对我不起作用的 application.cfc(在 myApp 中创建一个没有任何作用,因为我所在的环境包括 myApp 中的索引页面并从那里构建...客户端永远不会直接调用它来识别Application.cfc)

例如:

  • wwwroot/some/path/myApp/Shared/Base.cfc
  • wwwroot/some/path/myApp/Function/Function.cfc

我希望能够通过 super 和扩展从 Function.cfc 调用 Base.cfc 中的功能(其中包含应用程序中使用的常用方法)。

我可以访问 myApp 中的所有文件,但不能访问“wwwroot”、“some”或“path”。

为了在 Function.cfc 中扩展 Base.cfc,我必须扩展“some.path.myApp.Shared.Base”的完整路径,如果有人重命名 myApp 文件夹,这将导致问题,因为我必须手动编辑每个函数。扩展该 Base.cfc 的 cfc

我想要做的是创建一个特定于应用程序的“屏障”,因此如果应用程序文件夹名称发生更改,它不会造成大规模破坏,这需要我编辑所有使用 Base.cfc 功能的 CFC 文件。

由于我不能使用 Base 的相对路径(“..Shared.Base”),我想知道是否有一种方法可以在 myApp 文件夹中创建一个 CFC,我可以从中扩展并减轻重命名头痛发生或给它一个通用名称,如“myApp”并从那里扩展。(myApp.Shared.Base)

我无权访问 Application.cfm,也无权访问 Coldfusion 管理。

4

5 回答 5

2

就我个人而言,我会采用更简单的方法:将 Base 封装到 Function 中。

看起来您想将一组核心组件用于一些常见功能。如果这是真的——封装就更适用了。

可以动态构建对象的路径,例如(分步过程以便于阅读):

<cfscript>

    path1 = GetDirectoryFromPath(cgi.SCRIPT_NAME);
    path2 = ListToArray(path1, "/");
    path3 = path2;
    path3[ArrayLen(path3)] = "shared";
    path4 = ArrayToList(path3, ".");
    path5 = ArrayToList(path2, ".");

    myBase = CreateObject("component", "#path4#.Base");

    myFunction = CreateObject("component", "#path5#.Function").init(myBase);

</cfscript>

Function创建函数中init

<cffunction name="init">
    <cfargument name="base">
    <cfset variables.Base = arguments.base />
    <cfreturn this />
</cffunction>

当然,你可能有很强的扩展理由,但至少这种方法对父目录重命名不敏感。

于 2010-11-06T20:05:48.037 回答
1

如果 Base.cfc 没有扩展另一个 cfc,那么您可以将 Base.cfc 文件包含到函数文件夹中的另一个 cfc 文件中。

例如在函数文件夹中创建一个 cfc 文件,其内容为:

<cfinclude template="../shared/base.cfc" />

然后扩展新文件而不是共享文件夹中的 cfc。

于 2010-12-10T21:34:47.980 回答
0

我能看到的最简单的方法是在扩展函数目录中创建指向基本目录的符号链接或连接点。

不幸的是,它不是一个纯粹的 CF 解决方案,如果您需要移动代码,它也不是可移植的。希望有人会有更好的答案,但如果没有提供,这可能是一个后备点。

于 2010-10-23T02:18:48.710 回答
0

在应用程序启动/重置时生成代码...

例如,组件标签在不应直接运行的文件中可能是这样的......

<cfabort>
<cfcomponent extends="{sharedpath}.Base">
...

然后在 application.cfc 中的函数或从 application.cfc 调用的函数中执行类似的操作...

<cfdirectory name="codetemplates" action="list" directory="wwwroot/some/path/myApp/codetemplates" />
<cfloop query="codetemplates">
    <cffile name="temp" action="read" path="#tempfilepath##filename#" />
    <cfset newfilecontent = replace(temp.filecontent, '{sharedpath}', configvarwithrightpath) />
    <cfset filecontent = replace(newfilecontent , '<cfabort>', '') />
    <cffile name="temp" action="write" path="#livefilepath##filename#" />
</cfloop>

另一种方法是在本地运行一个构建过程以创建必要的代码,但我上面的示例将允许您更新配置变量并根据需要在实时环境中更新 cfc。

于 2010-11-08T20:03:44.877 回答
0

为什么要将共享代码放在单独的文件夹中?如果您只是将它与“函数”cfcs 放在同一个文件夹中,那么它们都可以使用相对路径对其进行扩展。

所以而不是:

  • wwwroot/some/path/myApp/Shared/Base.cfc
  • wwwroot/some/path/myApp/Function/Function.cfc

采用:

  • wwwroot/some/path/myApp/Function/Base.cfc
  • wwwroot/some/path/myApp/Function/Function.cfc

和:

<cfcomponent extends="Base"></cfcomponent>

但是,如果您有/需要多个“功能”级别的文件夹,那么您可以执行类似的操作。Proxy.cfc使用以下代码在每个“函数”级文件夹中放置一个:

<cfcomponent extends="some.path.myApp.shared.Base"></cfcomponent>

And then each cfc in the "function"-level folders would extend their local Proxy.cfc (extends="proxy"). This gives you 1 Proxy per folder, which is still not ideal, but less of a hassle than updating every cfc.

于 2010-12-13T02:01:50.243 回答