CFC扩展了兄弟文件夹

时间:2010-10-22 20:38:29

标签: coldfusion cfc application.cfc

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

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

This solution要求能够创建一个对我不起作用的application.cfc(在myApp中创建一个没有做任何事情因为我所在的环境包含myApp中的索引页面并从那里构建。 ..客户端从不直接调用它来激活Application.cfc的识别)

例如:

  • 的wwwroot /一些/路径/对myApp /共享/ Base.cfc
  • 的wwwroot /一些/路径/对myApp /功能/ Function.cfc

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

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

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

我正在寻找它创建一个特定于应用程序的“障碍”,因此如果应用程序文件夹名称更改,它将不会导致大规模破坏,需要我编辑所有使用Base.cfc功能的CFC文件。

由于我无法使用Base的相对路径(“..Shared.Base”),我想知道是否有办法在myApp文件夹中创建一个CFC,我可以从中扩展并减轻重命名的麻烦它应该发生或者给它一个像“myApp”这样的通用名称并从那里扩展。 (myApp.Shared.Base)

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

5 个答案:

答案 0 :(得分:2)

就个人而言,我会更简单:将Base封装到函数中。

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

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

<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>

当然,您可能有充分的理由进行扩展,但至少这种方法对父目录重命名不敏感。

答案 1 :(得分:1)

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

例如,在功能文件夹中创建一个cfc文件,内容为:

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

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

在app start / reset ...

上生成代码

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

<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。

答案 4 :(得分:0)

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

所以而不是:

  • 的wwwroot /一些/路径/对myApp /共享/ Base.cfc
  • 的wwwroot /一些/路径/对myApp /功能/ Function.cfc

使用:

  • 的wwwroot /一些/路径/对myApp /功能/ Base.cfc
  • 的wwwroot /一些/路径/对myApp /功能/ Function.cfc

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

但是,如果你有/需要多个“功能”级文件夹,那么你可以做类似的事情。将Proxy.cfc放在每个“function”-level文件夹中,使用以下代码:

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

然后“function”-level文件夹中的每个cfc都会扩展其本地Proxy.cfcextends="proxy")。这为每个文件夹提供了1个代理,这仍然不是理想的,但是比更新每个cfc更麻烦。