6

親ファイルまたは CF 管理にアクセスできる親フォルダーで CFC を拡張するためのあらゆる種類のソリューションを見てきましたが、親フォルダーにアクセスせずに「共有」/兄弟フォルダーで CFC を拡張する実行可能なソリューションは見たことがありません。

このソリューションには、親フォルダーへのアクセスが必要ですか? (これらのマッピングが何であるかはわかりませんが、Application.cfc にはアクセスできません)

このソリューションでは、私にとっては機能しない application.cfc を作成できる必要があります (私の環境には myApp のインデックス ページが含まれており、そこからビルドされるため、myApp で作成しても何も起こりません...クライアントが直接Application.cfc の認識を起動するために呼び出します)

例えば:

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

スーパーおよび拡張機能を介して Function.cfc から Base.cfc (アプリケーションで使用される一般的なメソッドを含む) の機能を呼び出せるようにしたいと考えています。

myApp 内のすべてのファイルにアクセスできますが、「wwwroot」、「some」、または「path」にはアクセスできません。

Function.cfc 内で Base.cfc を拡張するには、"some.path.myApp.Shared.Base" のフル パスを拡張する必要があります。これは、すべての関数を手動で編集する必要があるため、誰かが myApp フォルダーの名前を変更した場合に問題を引き起こす可能性があります。その Base.cfc を拡張する cfc

私がやろうとしているのは、アプリケーション固有の「バリア」を作成するため、アプリのフォルダー名が変更されても、Base.cfc の機能を使用するすべての CFC ファイルを編集する必要がある大混乱を引き起こすことはありません。

ベース ("..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

アプリの起動/リセット時にコードを生成...

たとえば、コンポーネントタグは、直接実行してはならないファイルでそのようになる可能性があります...

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

もう 1 つのアプローチは、ビルド プロセスをローカルで実行して必要なコードを作成することですが、上記の例では、ライブ環境で必要に応じて構成変数を更新し、cfc を更新できます。

于 2010-11-08T20:03:44.877 に答える
0

これを行う最も簡単な方法は、拡張関数ディレクトリ内のベース ディレクトリへのシンボリック リンクまたはジャンクション ポイントを作成することです。

残念ながら、これは純粋な CF ソリューションではなく、コードを移動する必要がある場合の移植性もありません。誰かがより良い答えを持っていることを願っていますが、何も提示されていない場合、これはフォールバックポイントになる可能性があります.

于 2010-10-23T02:18:48.710 に答える
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>

そして、「関数」レベルのフォルダー内の各 cfc は、ローカルProxy.cfc( extends="proxy") を拡張します。これにより、フォルダごとに 1 つのプロキシが得られます。これはまだ理想的ではありませんが、すべての cfc を更新するよりも面倒ではありません。

于 2010-12-13T02:01:50.243 に答える