Как получить название компонента, расширяющего мой в ColdFusion?

Допустим, у меня есть следующий компонент под названием Base :

<cfcomponent output="false">

    <cffunction name="init" access="public" returntype="Any" output="false">
        <cfset variables.metadata = getmetadata(this)>
        <cfreturn this>
    </cffunction>

    <cffunction name="getmeta" access="public" returntype="Any" output="false">
        <cfreturn variables.metadata>
    </cffunction>

</cfcomponent>

и я хочу расширить базу в другой компонент под названием Admin :

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

Теперь в моем приложении, если я делаю следующее при создании объекта:

<cfset obj = createobject("component", "Admin").init()>
<cfdump var="#obj.getmeta()#">

Метаданные, которые я получаю, говорят мне, что имя компонента - Admin, и оно расширяет мой базовый компонент. Это все хорошо, но я не хочу явно вызывать метод init () при создании объекта.

Было бы хорошо, если бы я мог сделать что-то подобное в моем компоненте Base :

<cfcomponent output="false">

    <cfset init()>

    <cffunction name="init" access="public" returntype="Any" output="false">
        <cfset variables.metadata = getmetadata(this)>
        <cfreturn this>
    </cffunction>

    <cffunction name="getmeta" access="public" returntype="Any" output="false">
        <cfreturn variables.metadata>
    </cffunction>

</cfcomponent>

Однако затем метаданные, возвращаемые методом getmeta (), говорят мне, что имя компонента - Base, хотя оно все еще расширяется. Есть мысли о том, как это сделать?

12.12.2008 18:49:56
3 ОТВЕТА

Есть ли причина, по которой вы не хотите вызывать init в каждом расширении cfc?

<cfcomponent output="false" extends="Base">
    <cfset super.init()>

</cfcomponent>

Кажется, что метаданные заполняются так, как вы хотите.

1
12.12.2008 20:50:22

Я не уверен на 100%, что вам нужно, но ColdFusion 8 добавил функцию getComponentMetaData (), которая вместо того, чтобы требовать создания экземпляра CFC, использует путь точечной нотации к CFC. Вы должны иметь возможность получить путь от Admin, который вы можете передать getComponentMetaData () без вызова init () для Base.

ColdFusion LiveDoc: getComponentMetaData ()

1
17.12.2008 16:20:39

6 лет, но я дам настоящий ответ ...

Учитывая Base.cfc:

component{
    public function foo(){
        return 'base';
    }
}

И Child.cfc:

component extends="Base"{
    public function foo(){
        return 'child';
    }
}

Чтобы узнать, какой компонент Child расширяет, просто сделайте это:

<cfscript>
child = createObject( "component", "Child" );
writeDump( getMetaData(child).extends.name );
</cfscript>
1
15.09.2014 16:32:17