2010-04-20 29 views
10

Me gustaría averiguar de alguna manera qué CFC llama a mi método.Encuentra quién llama al método

Tengo un CFC de registro que es llamado por muchos CFC's diferentes. En este CFC de registro, existe la necesidad de almacenar qué CFC solicitó el registro.

Si bien podría simplemente pasar el nombre CFC como argumento a mi log.cfc, me parece una tarea repetitiva, que podría no ser necesaria, si de alguna manera pudiera averiguar "quién" está llamando al método en el registro .cfc

¿Hay alguna forma programática de lograr esto?

Gracias de antemano

Respuesta

9

La manera más fácil es arrojar una excepción ficticia e inmediatamente atraparla. Pero esto tiene la desventaja de hacer aparecer una excepción ficticia en su resultado de depuración. Para mí, esto fue un factor decisivo, así que escribí el siguiente código (basado en this code on cflib). Quería crear un objeto que sea similar a un objeto cfcatch, para poder usarlo en lugares que esperaban un objeto cfcatch.

Nota: Es posible que tenga que ajustar este código un poco para que funcione en CF8 o antes. No creo que la sintaxis {...} para crear objetos fuera compatible con CF9.

StackTrace = { 
    Type= 'StackTrace', 
    Detail= '', 
    Message= 'This is not a real exception. It is only used to generate debugging information.', 
    TagContext= ArrayNew(1) 
}; 
j = CreateObject("java","java.lang.Thread").currentThread().getStackTrace(); 

for (i=1; i LTE ArrayLen(j); i++) 
{ 
    if(REFindNoCase("\.cf[cm]$", j[i].getFileName())) { 
    ArrayAppend(StackTrace.TagContext, { 
     Line= j[i].getLineNumber(), 
     Column= 0, 
     Template= j[i].getFileName() 
    }); 
    } 
} 
+0

que es una manera muy elegante. Gracias por eso –

0

que no conozco de un método que ver directamente lo que está pidiendo, tal vez alguien más lo hace.

Sin embargo, creo que podría obtener el seguimiento de la pila y crear una función para analizar la última llamada al método.

This function en cflib obtendrá el seguimiento de la pila.

3

De ColdFusion 10 ahora hay una función para hacer esto callStackGet()

Por ejemplo el siguiente código volcar el seguimiento de la pila a D:/web/cfdump.txt

<cfdump var="#callStackGet()#" output="D:/web/cfdump.txt"> 
Cuestiones relacionadas