2010-10-22 11 views
5

He visto todo tipo de soluciones para extender cfcs en carpetas principales con acceso a archivos principales o la administración de CF, pero no he visto una solución viable para extender un cfc en un "compartido"/hermano carpeta sin acceso a las carpetas principales.CFC extiende la carpeta de hermanos

This solution requiere acceso a carpetas principales? (No estoy seguro de cuáles son estas asignaciones, pero no tengo acceso a Application.cfc de todos modos)

This solution requiere poder crear una aplicación.cfc que no me funcione (crear una en myApp no ​​hace nada porque el entorno estoy en la página de índice incluye en myApp y construye a partir de ahí ... el cliente nunca llama directamente al fuego reconocimiento de Application.cfc)

Por ejemplo:

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

Estoy buscando poder llamar la funcionalidad en el Base.cfc (que contiene los métodos comunes utilizados en la aplicación) desde el Function.cfc a través de super y extensión.

Tengo acceso a todos los archivos dentro de myApp, pero no a "wwwroot", "some" o "path".

Para extender Base.cfc dentro de Function.cfc, tengo que extender la ruta completa de "some.path.myApp.Shared.Base" Esto causaría problemas si alguien cambiara el nombre de la carpeta myApp ya que tendría que hacerlo a mano edite cada Function.cfc que amplía Base.cfc

Lo que estoy buscando para crear una "barrera" específica de la aplicación, por lo que si cambia el nombre de la carpeta de la aplicación no causará estragos que requiera que edite todo el CFC archivos que usan funcionalidad desde Base.cfc.

Dado que no puedo usar rutas de acceso relativas a la Base ("..Shared.Base") me pregunto si hay una manera de crear un CFC en la carpeta myApp que pueda extender y aliviar el dolor de cabeza de cambio de nombre si ocurriera o una forma de darle un nombre genérico como "myApp" y extender desde allí. (myApp.Shared.Base)

No tengo acceso a Application.cfm ni a la administración de Coldfusion.

Respuesta

2

Personalmente iría de una manera más simple: incapsular la base en la función.

Parece que desea utilizar el conjunto de componentes principales para algunas funciones comunes. Si esto es cierto, la encapsulación es aún más aplicable.

Caminos hacia objetos pueden ser construidos de forma dinámica, por ejemplo (proceso paso a paso para facilitar la lectura):

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

En el Function función init Crear:

<cffunction name="init"> 
    <cfargument name="base"> 
    <cfset variables.Base = arguments.base /> 
    <cfreturn this /> 
</cffunction> 

Por supuesto, es posible que tenga razones importantes para ampliar, pero al menos este enfoque no es sensible al cambio de nombre de los directorios principales.

0

La manera más fácil que puedo ver para hacer esto es crear un enlace simbólico o un punto de unión al directorio base en el directorio de la función de extensión.

Desafortunadamente, no es una solución CF pura, ni portátil si necesita mover su código. Con suerte, alguien tendrá una mejor respuesta, pero podría ser un punto de apoyo si no se presenta ninguna.

+0

No tengo control sobre el servidor, así que esto no funcionará, pero es una buena suposición. El único problema que veo con esto es que en realidad todavía causaría el mismo problema. Si cambia la ruta de todos modos, el analizador de Coldfusion moriría al tratar de ampliar la ruta que no está allí. – Andir

0

generar el código de inicio de aplicaciones/reset ...

Por ejemplo, el código de componente podría ser como tal en un archivo que no se debe ejecutar directamente ...

<cfabort> 
<cfcomponent extends="{sharedpath}.Base"> 
... 

entonces en una la función de llamada o de Application.cfc hacer algo como esto ...

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

el otro enfoque es tener un proceso de construcción a nivel local que se ejecuta para crear el código necesario pero mi ejemplo anterior WO uld le permite actualizar una variable de configuración y actualizar las cfc según sea necesario en un entorno en vivo.

1

Si Base.cfc no extiende otro cfc, entonces usted puede ser capaz de incluir el archivo Base.cfc en otro archivo cfc en su carpeta de funciones.

Por ejemplo crear un archivo en la carpeta de CFC función con contenido:

<cfinclude template="../shared/base.cfc" /> 

luego extender el nuevo archivo en lugar del CFC en la carpeta compartida.

0

¿Por qué molestarse en poner el código compartido en una carpeta separada? Si lo coloca en la misma carpeta que sus cfcs "funciones", entonces todos pueden extenderlo utilizando una ruta relativa.

Así que en lugar de:

  • wwwroot/some/ruta/myApp/Shared/Base.cfc
  • wwwroot/some/ruta/myApp/Función/Function.cfc

Uso :

  • wwwroot/some/ruta/myApp/Función/Base.cfc
  • wwwroot/some/p ath/myApp/Función/Function.cfc

y:

<cfcomponent extends="Base"></cfcomponent> 

Sin embargo, si usted tiene/necesitar múltiples carpetas de "función" -level, a continuación, puede hacer algo similar. Poner un Proxy.cfc dentro de cada "función" carpeta -level, con este código:

<cfcomponent extends="some.path.myApp.shared.Base"></cfcomponent> 

y luego cada uno de CFC en las carpetas de "función" -level extendería sus locales Proxy.cfc (extends="proxy").Esto le da 1 Proxy por carpeta, que todavía no es ideal, pero menos molesto que actualizar cada cfc.