Pergunta

Eu tenho os dois seguintes arquivos e gostaria que a segunda para estender o primeiro:

  1. wwwroot \ local \ Application.cfc
  2. wwwroot \ local \ dir \ Application.cfc

No entanto, quando eu ir para declarar o componente para o segundo arquivo, eu não tenho certeza o que colocar no atributo estende. meu problema é que vários sites dev (com um repositório SVN compartilhada) estão correndo na mesma instância do ColdFusion , então eu não pode simplesmente criar um mapeamento na administração CF assim:

<cfcomponent extends="site.application">

No entanto, o ColdFusion não gosta:

<cfcomponent extends="..application">

ou qualquer entrada dinâmica como:

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

Criando um mapeamento de tempo de execução ( como aqui ) não parece possível qualquer um. Criá-la na Application.cfc base é inútil, porque esse código ainda não foi executada pelo tempo que o cfc herdar está sendo declarados; e eu não posso criar o mapeamento antes do componente herdando é definido porque ainda não é uma aplicação para anexá-lo.

Existe alguma maneira eu posso fazer referência ao diretório pai para cumprir a minha estende?

Editar para esclarecer: A solução ApplicationProxy não funciona por causa do texto em negrito acima. Agora, como uma solução alternativa, estamos simplesmente não verificar o \ dir \ Application.cfc no SVN para que cada desenvolvedor pode manter uma versão que se estende seu / sua própria Application.cfc raiz. Obviamente, isso não é o ideal.

Foi útil?

Solução

O código a seguir está funcionando para mim. Uma coisa que notei é que embora o Application.cfc parece ficar em cache, então muda para o cfc aplicativo pai não pode ser refletida. Eu tenho em torno deste fazendo uma mudança trivial à cfc aplicativo filho.

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

Outras dicas

Sean Corfield tem uma entrada de blog explicando como estender uma raiz Application.cfc .

Abaixo está a informação relevante copiado do que a entrada.


Aqui está a sua raiz CFC /Application.cfc:

<cfcomponent>

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

</cfcomponent>

Aqui está o seu proxy CFC /ApplicationProxy.cfc:

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

É completamente vazio e serve apenas para criar um alias para a sua raiz /Application.cfc. Aqui está seu subdiretório 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>

A raiz do cada site individual deve ter seu próprio Mestre App:

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

Todas estas aplicações são aplicações individuais separados com nada compartilhado entre eles.

Se qualquer um desses sites individuais precisam ter sub-aplicações, então não deve haver ApplicationProxy.cfc alonside o Mestre,

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

Então, para cada sub-aplicativo, você tem o que estende o proxy:

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

Eu sei que este é um tema antigo, mas eu encontrei uma maneira de fazê-lo (que parece funcionar no meu teste) sem usar os mapeamentos CF administrador.

Você pode fazer isso adicionando um mapeamento de cada aplicativo em seu filho Application.cfc usando um caminho relativo expandido:

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

Sim, ele se sente pouco hacky, mas parece trabalho.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top