13

次の2つのファイルがあり、2番目のファイルで最初のファイルを拡張したいと思います。

  1. wwwroot \ site \ application.cfc
  2. wwwroot \ site \ dir \ application.cfc

ただし、2番目のファイルのコンポーネントを宣言しようとすると、extends属性に何を入れるべきかわかりません。 私の問題は、複数の開発サイト(共有SVNリポジトリを使用)がColdFusionの同じインスタンスで実行されているため、CF管理者で次のようにマッピングを作成することはできません。

<cfcomponent extends="site.application">

ただし、ColdFusionは次のことを好みません。

<cfcomponent extends="..application">

または次のような動的入力:

<cfcomponent extends="#expandpath('..').#application">

ランタイムマッピング(ここのように)を作成することも可能ではないようです。ベースのapplication.cfcで作成しても、継承するcfcが宣言されるまでにそのコードはまだ実行されていないため、役に立ちません。継承するコンポーネントが定義される前にマッピングを作成することはできません。これは、コンポーネントをアタッチするアプリケーションがまだないためです。

親ディレクトリを参照して拡張を実行する方法はありますか?

明確にするために編集:上記の太字のテキストのため、ApplicationProxyソリューションは機能しません。現在、回避策として、\ dir \ application.cfcをSVNにチェックインしていないため、各開発者は自分のルートapplication.cfcを拡張するバージョンを保持できます。明らかに、これは理想的ではありません。

4

4 に答える 4

16

Sean Corfieldには、ルートApplication.cfcを拡張する方法を説明するブログエントリがあります。

以下は、そのエントリからコピーされた関連情報です。


ルートCFC/Application.cfcは次のとおりです。

<cfcomponent>

    <cfset this.name = "cf7app" />
    <cfset this.sessionmanagement = true />

</cfcomponent>

プロキシCFC/ApplicationProxy.cfcは次のとおりです。

<cfcomponent extends="Application">
</cfcomponent>

これは完全に空であり、ルート/Application.cfcのエイリアスを作成するためだけに使用されます。サブディレクトリCFC/app/Application.cfcは次のとおりです。

<cfcomponent extends="ApplicationProxy">

    <cffunction name="onSessionStart">
        <cfoutput><p>app.Application.onSessionStart()</p></cfoutput>
        <cfset session.counter = 0 />
    </cffunction>

    <cffunction name="onRequestStart">
        <cfoutput><p>app.Application.onRequestStart()</p></cfoutput>
        <cfdump label="application" var="#application#"/>
    </cffunction>

</cfcomponent>

個々のサイトのルートには、独自のマスターアプリが必要です。

/site1/Application.cfc
/site2/Application.cfc
/site3/Application.cfc

これらのアプリケーションはすべて個別のアプリであり、それらの間で何も共有されていません。

これらの個々のサイトのいずれかにサブアプリケーションが必要な場合は、マスターの横にApplicationProxy.cfcが必要です。

e.g.
/site1/ApplicationProxy.cfc
/site2/ApplicationProxy.cfc

次に、サブアプリケーションごとに、プロキシを拡張するものがあります。

e.g.
/site1/subA/Application.cfc
/site1/subB/Application.cfc
/site2/subA/Application.cfc
于 2008-11-21T00:49:57.020 に答える
4

次のコードは私のために働いています。ただし、application.cfc がキャッシュされているように見えるため、親アプリケーションの cfc への変更が反映されない可能性があることに気付きました。子アプリケーションの cfc に簡単な変更を加えることで、これを回避しました。

<cfcomponent output="false">
        <cfset variables.higherPath = ReReplace(GetMetaData(this).name,"\.[^\.]+\.[^\.]+$","") />
        <cfset variables.extendApp = CreateObject("component", "#variables.higherPath#.Application") />

        <cfloop item="variables.key" collection="#variables.extendApp#">
            <cfif IsCustomFunction(variables.extendApp[variables.key])>
                <cfset super[variables.key] = variables.extendApp[variables.key]>
            <cfelse>
                <cfset this[variables.key] = variables.extendApp[variables.key] >
            </cfif>
        </cfloop>
        <cffunction name="onApplicationStart" output="false">
            <cfset super.onApplicationStart() />
        </cffunction>
于 2008-11-21T21:42:32.640 に答える
3

これが古いトピックであることはわかっていますが、CF 管理者マッピングを使用せずにそれを行う方法を見つけました (私のテストではうまくいくようです)。

これを行うには、展開された相対パスを使用して、子 Application.cfc にアプリケーションごとのマッピングを追加します。

<cfcomponent extends="cms.Application" output="false">
<cfset this.mappings["/cms"] = expandPath(getDirectoryFromPath(getCurrentTemplatePath()) & "../../../../")>
<cflog text="#getMetadata(this).extends.path#">
</cfcomponent>

ええ、少しハッキーに感じますが、うまくいくようです。

于 2010-03-08T16:50:16.250 に答える