2012-04-04 15 views
3

Nun scheint dies etwas sehr geradlinig zu sein, aber anscheinend nicht so in ColdFusion. Ich muss eine Instanz eines CFC in sich selbst erstellen, wie in var a = new this(), aber das funktioniert offensichtlich nicht. Der CFC-Name kann nicht verwendet werden, da es eine Basis ist, die so erweitert werden, werde ich um das Problem ein Hack bin versucht, mit den folgenden:Erstellen einer neuen Instanz in CFC

component { 
    public function subQuery (required string table) { 

     var classPath = getMetaData(this).fullname; 
     return createObject("component", classPath).init(table, this.dsn); 

    } 
} 

Dies wäre akzeptabel, aber der Klassenpfad von getMetaData(this).fullname zurückgegeben wird, ist falsch . Der CFC befindet sich in einem Ordner mit einem Namen wie in my-folder und der zurückgegebene Pfad sieht wie my.-folder.myCFC mit einem vor dem Bindestrich eingefügten Zeitraum aus. Natürlich könnte ich diese Saite mit einer Regex manipulieren, aber das ist einfach keine Straße, die ich hinuntergehen möchte.

Ich hoffe, jemand hat einen saubereren Ansatz, danke.

Antwort

4

Sie sollten in der Lage sein, dies ohne irgendeinen Kontext für den Objektnamen zu tun, da es von innen heraus ausgeführt wird und sein aktuelles Verzeichnis überprüfen sollte.

Die folgende Beschreibung ist daher die Arbeit erledigen müssen Sie

var classPath = ListLast(getMetaData(this).fullname,'.'); 
return createObject("component", classPath).init(table, this.dsn); 

Auf diese Weise ist es egal, was die Verzeichnisnamen sind, und es wird auf alle Objekte arbeiten, erweitern, dass man unabhängig von Verzeichnisstruktur, oder für ein vollständiges Beispiel

public function cloneMe() { 
    return CreateObject('component', ListLast(getMetaData(this).fullname,'.')).init(argumentCollection=arguments); 
} 

Auf diese Weise werden alle übergebenen Argumente in die init übergeben. I.e. eine Verlängerung CFC kann die Methode als die Neudefinition folgende (wenn Sie Fehler wollen, wenn die init Argumente sind nicht im Lieferumfang enthalten)

public function cloneMe(required string table) { 
    return super.cloneMe(table=arguments.table,dsn=this.dsn); 
} 
+0

Ich hatte gehofft, dass ich hatte einige dieser in Verfahren gebaut verpassten in der Dokumentation zu tun, aber vielleicht nicht . Obwohl das immer noch wie ein schrecklicher Hack aussieht, habe ich keine bessere Option. Danke für deine Hilfe Simon. –

+0

Ich hatte ähnliche Probleme beim Versuch, untergeordnete Objekte aufzurufen, und schließlich den relativen Pfad adressiert sie als sonst, wie Sie identifiziert haben, musste auf Regex oder Mappings zurückgreifen - beide sind nicht ideal/behindert Portabilität/Erweiterbarkeit –

Verwandte Themen