Как получить название компонента, который расширяет мой в ColdFusion? - PullRequest
2 голосов
/ 12 декабря 2008

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

<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 и расширяет мой Base компонент. Это все хорошо, но я не хочу явно вызывать метод 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 , хотя оно все еще расширяется. Есть мысли о том, как этого добиться?

Ответы [ 3 ]

1 голос
/ 17 декабря 2008

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

ColdFusion LiveDoc: getComponentMetaData ()

1 голос
/ 15 сентября 2014

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

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

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

и Child.cfc:

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

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

<cfscript>
child = createObject( "component", "Child" );
writeDump( getMetaData(child).extends.name );
</cfscript>
1 голос
/ 12 декабря 2008

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

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

</cfcomponent>

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...