2010-04-06 8 views
8

Il mio background è in Propel, quindi speravo fosse una cosa semplice sovrascrivere un getter magico in Doctrine_Record (sfDoctrineRecord), ma sto ricevendo un Segfault o il metodo di override viene semplicemente ignorato a favore di quello nella superclasse.Sovrascrittura dei metodi di istanza Doctrine_Record (sfDoctrineRecord) 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; 

    } 

} 

Qual è il modo corretto per estendere dottrina metodi/override di un'istanza di Doctrine_Record (via sfDoctrineRecord estende Doctrine_Record)? Questo deve essere fattibile ... o dovrei guardare la documentazione di Template?

Grazie, Brian

risposta

7

Prova _GET e _set metodi.

+0

Impressionante, grazie. – Brian

8

Non sei sicuro di che cosa si voleva fare esattamente, ma qui ci sono alcuni suggerimenti:

  1. Dottrina (con l'attributo ATTR_AUTO_ACCESSOR_OVERRIDE abilitato, che è abilitato da symfony) consente di ignorare certi getter di colonne di componenti semplicemente definendo i metodi getColumnName nella classe del modello. Ecco perché il tuo metodo getDisplayName può cadere in loop infinito che di solito causa segfault.

  2. Per accedere/modificare il valore della colonna direttamente (bypassando personalizzato (get | set) TERS) è necessario utilizzare _get('column_name') e _set('column_name') metodi definiti da Doctrine_Record classe.

  3. Tutte le chiamate $obj->getSomething(), $obj->something e $obj['something'] sono in realtà magiche. Sono "reindirizzati" a $obj->get('something') che è solo reale modo per accedere ai dati del modello.

+0

Grazie per le informazioni su ATTR_AUTO_ACCESSOR_OVERRIDE; ora vedo dove in Doctrine_Record viene controllato prima di restituire il valore del campo. -br – Brian

2

Configurare Doctrine:

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

poi:

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

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

Funzionerà se diciamo Anything = 'test_var'? Sto cercando di ottenere metodi getter per lavorare con i nomi dei campi che hanno underscore ma in qualche modo non funziona. Eventuali suggerimenti? – Shivaas

+0

@Shivaas Prova con 'getTestVar' per' test_var' – takeshin

+0

Farò un tentativo! grazie per l'aiuto. – Shivaas

5

Questo funziona:

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 funziona perfettamente con Doctrine 1.2 – Benoit

Problemi correlati