Extending application.cfc in a subdirectory

一世执手 提交于 2019-11-27 20:14:11

The following code is working for me. One thing I noticed though is that the application.cfc seems to get cached, so changes to the parent application cfc might not be reflected. I got around this by doing a trivial change to the child application 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>

Sean Corfield has a blog entry explaining how to extend a root Application.cfc.

Below is the relevant information copied from that entry.


Here's your root CFC /Application.cfc:

<cfcomponent>

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

</cfcomponent>

Here's your proxy CFC /ApplicationProxy.cfc:

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

It's completely empty and serves merely to create an alias for your root /Application.cfc. Here's your subdirectory 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>

The root of each individual site should have its own Master App:

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

All these applications are separate individual apps with nothing shared between them.

If any of these individual sites need to have sub-applications, then there should be ApplicationProxy.cfc alonside the Master,

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

Then, for each sub-application you have the one that extends the proxy:

e.g.
/site1/subA/Application.cfc
/site1/subB/Application.cfc
/site2/subA/Application.cfc

I know this is an old topic, but I found a way to do it (that seems to work in my testing) without using the CF Administrator mappings.

You can do this by adding a per-application mapping in your child Application.cfc using an expanded relative path:

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

Yeah, it feels little hacky, but it seems to work.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!