Remplacement des méthodes d'instance Doctrine_Record (sfDoctrineRecord) dans la doctrine PHP Symfony
-
24-09-2019 - |
Question
Mon arrière-plan est Propel, donc j'espérait que ce serait une chose simple de passer outre un getter magique dans un Doctrine_Record (sfDoctrineRecord), mais j'obtenir soit un Segfault ou la méthode de remplacement est tout simplement ignorée en faveur de la une dans la 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;
}
}
Quelle est la bonne façon de la doctrine d'étendre / méthodes de remplacement sur une instance de Doctrine_Record (via étend sfDoctrineRecord Doctrine_Record)? Cela doit être faisable ... ou devrais-je être à la recherche à la documentation du modèle?
Merci, Brian
La solution
Essayez des méthodes _GET et _set.
Autres conseils
Je ne sais pas à propos de ce que vous vouliez faire exactement , mais voici quelques conseils:
-
Doctrine (avec attribut
ATTR_AUTO_ACCESSOR_OVERRIDE
activé, ce qui est rendue possible par symfony) vous permet de passer outre les apporteurs de certaines colonnes de composants tout en définissant des méthodes degetColumnName
en classe modèle. Voilà pourquoi votre méthode degetDisplayName
peut tomber boucle infinie qui provoque généralement segfault. -
Pour accéder / modifier la valeur de la colonne directement (sans passer par commande (get | set) TERs). Vous devez utiliser des méthodes de
_get('column_name')
et_set('column_name')
définies par classeDoctrine_Record
-
Toutes les
$obj->getSomething()
,$obj->something
et appelle$obj['something']
sont en fait magique. Ils sont "redirigés" à$obj->get('something')
qui est seulement réel façon d'accéder aux données du modèle.
Cela fonctionne:
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;
}
}
Configurer Doctrine:
$manager->setAttribute(Doctrine::ATTR_AUTO_ACCESSOR_OVERRIDE, true);
alors:
public function getAnything()
{
return $this->_get('anything');
}
public function setAnything()
{
return $this->_set('anything', $value);
}