2010-04-06 14 views
8

Mein Hintergrund ist in Propel, also hatte ich gehofft, es wäre eine einfache Sache, einen Magischen Getter in einem Doctrine_Record (sfDoctrineRecord) zu überschreiben, aber ich bekomme entweder einen Segfault oder die Override-Methode wird einfach zugunsten der in der Oberklasse ignoriert.Überschreiben von Doctrine_Record (sfDoctrineRecord) Instanzmethoden in Doctrine PHP Symfony

https://gist.github.com/697008eaf4d7b606286a

class FaqCategory extends BaseFaqCategory 
{ 

    public function __toString() 
    { 
    return $this->getCategory(); 
    } 

    // doesn't work 
    // override getDisplayName to fall back to category name if getDisplayName doesn't exist 
    public function getDisplayName() { 

    // also tried parent::getDisplayName() but got segfault(!) 
    if(isset($this->display_name)) { 
     $display_name = $this->display_name; 
    } else { 
     $display_name = $this->category; 
    } 

    return $display_name; 

    } 

} 

Was ist die richtige Art und Weise Lehre/Übersteuerungsverfahren auf einer Instanz von Doctrine_Record zu erstrecken (über sfDoctrineRecord erstreckt Doctrine_Record)? Das muss machbar sein ... oder sollte ich mir die Template-Dokumentation ansehen?

Danke, Brian

Antwort

7

Try _get und _SET Methoden.

+0

Super, danke. – Brian

8

Nicht sicher, was Sie wollen Sie tun genau, aber hier sind ein paar Hinweise:

  1. Lehre (mit ATTR_AUTO_ACCESSOR_OVERRIDE Attribute aktiviert, die von symfony aktiviert ist) können Sie bestimmen außer Kraft setzen Getter der Komponentenspalten, indem einfach getColumnName Methoden in der Modellklasse definiert werden. Deshalb kann Ihre getDisplayName Methode auf Endlosschleife fallen, was normalerweise zu einem segfault führt.

  2. Um den Zugriff/Spalte Wert direkt ändern (custom Umgehung (get | set) ters) Sie haben _get('column_name') und _set('column_name') Methoden von Doctrine_Record Klasse definiert verwenden.

  3. Alle $obj->getSomething(), $obj->something und $obj['something'] Anrufe sind eigentlich magisch. Sie sind "umgeleitet" zu $obj->get('something'), die nur echte Weg ist, um auf Modelldaten zuzugreifen.

+0

Danke für die Info über ATTR_AUTO_ACCESSOR_OVERRIDE; Jetzt sehe ich, wo in Doctrine_Record das überprüft wird, bevor Sie den Wert des Feldes zurücksenden. -br – Brian

2

Configure Lehre:

$manager->setAttribute(Doctrine::ATTR_AUTO_ACCESSOR_OVERRIDE, true); 

dann:

public function getAnything() 
{ 
    return $this->_get('anything'); 
} 

public function setAnything() 
{ 
    return $this->_set('anything', $value); 
} 
+0

Funktioniert das, wenn Anything = 'test_var' gesagt wird? Ich versuche, Getter-Methoden zu bekommen, um mit Feldnamen zu arbeiten, die Unterstriche haben, aber irgendwie funktioniert das nicht. Irgendwelche Vorschläge? – Shivaas

+0

@Shivaas Versuchen Sie mit 'getTestVar' für' test_var' – takeshin

+0

Ich gebe es eine Chance! Danke für deine Hilfe. – Shivaas

5

Dies funktioniert:

class FaqCategory extends BaseFaqCategory 
{ 

    public function __toString() 
    { 
    return $this->getCategory(); 
    } 

    public function getDisplayName() { 

    if($this->_get("display_name") != "") { 
     $display_name = $this->_get("display_name"); 
    } else { 
     $display_name = $this->getCategory(); 
    } 

    return $display_name; 

    } 

} 
+1

+1 das funktioniert perfekt mit Doctrine 1.2 – Benoit

Verwandte Themen