Prevalente Doctrine_Record (sfDoctrineRecord) metodi di istanza in dottrina PHP Symfony
-
24-09-2019 - |
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
Soluzione
Prova _GET e _set metodi.
Altri suggerimenti
Non sei sicuro di che cosa si voleva fare esattamente , ma qui ci sono alcuni suggerimenti:
-
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 metodigetColumnName
nella classe del modello. Ecco perché il metodo digetDisplayName
può cadere ciclo infinito che di solito causano segmentation fault. -
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 classeDoctrine_Record
chiamate -
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);
}