Ser Programador

Como obter os nomes das funções de um component do Adobe ColdFusion

Vamos ver como é simples obter os nomes dos métodos de um objeto do CF.


Certa vez precisei fazer uma validação de métodos existentes em um objeto que eu estava trabalhando no ColdFusion.


Isso era necessário para que assim eu pudesse deixar o script funcionando de forma mais dinâmica, passando qual método requisitar do objeto de forma automática, sem necessidade de um bloco de validações mais complexo.


Inclusive a experiência daquela ocasião serviu como fundamento para eu escrever o artigo sobre Orientação a Objetos no ColdFusion. Caso queira conferir, está NESTE ARTIGO.


Para obter uma lista das cffunctions (métodos) existentes num component (objeto) do ColdFusion, utilizamos a função getmetadata, passando como parâmetro a variável contendo o objeto carregado no script:

		<cfset meuComponent = createObject("component", "meu_component")>
		<cfset metaDataDoComponent = getmetadata(meuComponent)>
	

O resultado da função getmetadata é uma struct, onde um dos itens dela é FUNCTIONS: um array contendo uma lista de structs que trazem os dados dos métodos desse objeto.


Então, basta percorrer essa struct FUNCTIONS com um cfloop para construir uma lista em um array:

		<cfset meuComponent = createObject("component", "meu_component")>
		<cfset metaDataDoComponent = getmetadata(meuComponent)>

		<cfset metodosDoComponent = []>
		<cfloop array="#metaDataDoComponent.functions#" index="function">
			<cfset arrayAppend(metodosDoComponent, function.name)>
		</cfloop>
	

Na linha 4, fazemos um loop no array FUNCTIONS da struct metaDataDoComponent, e assim, para cada item desse array, fazemos um append no array metodosDoComponent, alimentando-o com os nomes dos métodos;


Apenas para efeito de teste, vamos criar um component fictício chamado meu_component.cfc para testar nosso script:

		<cfcomponent>
			<cffunction name="metodo1"></cffunction>
			<cffunction name="metodo2"></cffunction>
			<cffunction name="metodo3"></cffunction>
		</cfcomponent>
	

Vamos agora percorrer o array metodosDoComponent com um cfloop para ver em tela os nomes dos métodos:

		<cfset meuComponent = createObject("component", "meu_component")>
		<cfset metaDataDoComponent = getmetadata(meuComponent)>

		<cfset metodosDoComponent = []>
		<cfloop array="#metaDataDoComponent.functions#" index="function">
			<cfset arrayAppend(metodosDoComponent, function.name)>
		</cfloop>

		<cfloop array="#metodosDoComponent#" index="metodo">
			<cfoutput>O método é: #metodo#;<br></cfoutput>
		</cfloop>
	

Se tudo estiver correto, e o resultado do nosso script será:

		O método é: metodo3;
		O método é: metodo2;
		O método é: metodo1;
	

Os métodos serão apresentados em forma decrescente comparado à ordem de instância no meu_component.cfc, porque por algum motivo em particular do ColdFusion, ele próprio registra os métodos na memória de forma decrescente. Isso pode ser constatado dando um cfdump em metaDataDoComponent.functions.