Remplacement des méthodes d'instance Doctrine_Record (sfDoctrineRecord) dans la doctrine PHP Symfony

StackOverflow https://stackoverflow.com/questions/2587115

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

Était-ce utile?

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:

  1. 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 de getColumnName en classe modèle. Voilà pourquoi votre méthode de getDisplayName peut tomber boucle infinie qui provoque généralement segfault.

  2. 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 classe Doctrine_Record

  3. 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);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top