coldfusion cfc application.cfc

coldfusion - Extendiendo application.cfc en un subdirectorio



(3)

Tengo los siguientes dos archivos y me gustaría que el segundo amplíe el primero:

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

Sin embargo, cuando voy a declarar el componente para el segundo archivo, no estoy seguro de qué poner en el atributo extends. Mi problema es que varios sitios dev (con un repositorio SVN compartido) se ejecutan en la misma instancia de ColdFusion , por lo que no puedo simplemente crear una asignación en el administrador de CF así:

<cfcomponent extends="site.application">

Sin embargo, a ColdFusion no le gusta:

<cfcomponent extends="..application">

o cualquier entrada dinámica como:

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

Crear una asignación en tiempo de ejecución ( como aquí ) tampoco parece posible. Crearlo en la aplicación base.cfc es inútil porque ese código aún no se ha ejecutado cuando se declara el cfc heredado; y no puedo crear la asignación antes de que se defina el componente heredado porque aún no hay una aplicación para adjuntarlo.

¿Hay alguna manera de que pueda hacer referencia al directorio principal para lograr mi extensión?

Editar para aclarar: la solución ApplicationProxy no funciona debido al texto en negrita de arriba. En este momento, como solución alternativa, simplemente no verificamos el / dir / application.cfc en SVN para que cada desarrollador pueda mantener una versión que extienda su propia raíz application.cfc. Obviamente, esto no es ideal.


El siguiente código me funciona. Sin embargo, una cosa que noté es que la aplicación.cfc parece estar en caché, por lo que los cambios a la aplicación padre cfc podrían no reflejarse. Lo solucioné haciendo un cambio trivial en la aplicación infantil 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>


Sé que este es un tema antiguo, pero encontré una forma de hacerlo (que parece funcionar en mis pruebas) sin utilizar las asignaciones de CF Administrator.

Puede hacer esto agregando una asignación por aplicación en su hijo Application.cfc utilizando una ruta relativa expandida:

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

Sí, parece poco hacky, pero parece funcionar.


Sean Corfield tiene una entrada de blog que explica cómo extender una raíz Application.cfc .

A continuación se muestra la información relevante copiada de esa entrada.

Aquí está su raíz CFC / Application.cfc:

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

Aquí está su proxy CFC / ApplicationProxy.cfc:

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

Está completamente vacío y sirve simplemente para crear un alias para su raíz / Application.cfc. Aquí está su subdirectorio 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>

La raíz de cada sitio individual debe tener su propia aplicación maestra:

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

Todas estas aplicaciones son aplicaciones individuales separadas sin nada compartido entre ellas.

Si alguno de estos sitios individuales necesita tener sub-aplicaciones, entonces debe haber ApplicationProxy.cfc al lado del maestro,

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

Luego, para cada subaplicación, tiene la que extiende el proxy:

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