Domanda

Il mio background è in Propel, quindi speravo che sarebbe stata una cosa semplice per sostituire un getter magica in un Doctrine_Record (sfDoctrineRecord), ma sto ottenendo sia un Segfault o il metodo di sostituzione viene semplicemente ignorato a favore del uno nella superclasse.

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 di override su un'istanza di Doctrine_Record (via sfDoctrineRecord estende Doctrine_Record)? Questo deve essere fattibile ... o devo essere guardando la documentazione Template?

Grazie, Brian

È stato utile?

Soluzione

Prova _GET e _set metodi.

Altri suggerimenti

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 abilitata da symfony) consente di sovrascrivere getter alcune colonne dei componenti solo attraverso la definizione di metodi getColumnName nella classe del modello. Ecco perché il metodo di getDisplayName può cadere ciclo infinito che di solito causano segmentation fault.

  2. Per accedere / modificare il valore della colonna direttamente (bypassando personalizzato (ottenere | TERS set)). Devi usare _get('column_name') e _set('column_name') metodi definiti per classe Doctrine_Record

  3. chiamate
  4. Tutti i $obj->getSomething(), $obj->something e $obj['something'] sono in realtà magica. Essi sono "reindirizzati" per $obj->get('something') che è solo reale modo di dati del modello di accesso.

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;

  }

}

Configura Dottrina:

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

quindi:

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

public function setAnything()
{
    return $this->_set('anything', $value);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top