8
votes

Méthodes d'instance Doctrine_Record (SFDocTrinerecord) Remplacer la doctrine PHP Symfony

Mon arrière-plan est en propulseur, alors j'espérais que ce serait une chose simple de remplacer un getter magique dans une doctrine_record (Sfdoctrinerecord), mais je reçois un segfault ou la méthode de remplacement est simplement ignorée en faveur de la Un dans la superclasse.

https://gist.github.com/697008AF4D7B606286A P>

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;

  }

}


0 commentaires

4 Réponses :


8
votes

Essayez des méthodes _GET et _SET.


0 commentaires

9
votes

Pas sûr de ce que vous vouliez faire exactement , mais voici quelques indications:

  1. doctrine (avec attr_auto_accessor_override attribut activé, que est activé activé par Symfony) vous permet de remplacer certaines colonnes de composants 'getters simplement en définissant getcolumnname < / Code> Méthodes dans la classe modèle. C'est pourquoi votre méthode getdisplayName peut tomber en boucle infinie qui provoque généralement SEGFAULT.

  2. Pour accéder / modifier la valeur de la colonne directement (contournement personnalisée (GET | SET) TERS) Vous devez utiliser _GET ('Column_Name') et _set ('Nom de colonne ") Méthodes définis par doctrine_record classe.

  3. tout le $ obj-> grossistes () , $ obj-> quelque chose et obj ["quelque chose"] Les appels sont en réalité magiques. Ils sont "redirigèrent" à $ obj-> obtenir ("quelque chose") qui n'est que réel moyen d'accéder aux données de modèle.


1 commentaires

Merci pour l'info sur attr_auto_accessor_override; Je vois maintenant où dans la doctrine_record vérifié avant d'envoyer la valeur du champ. -Br



2
votes

Configurer la doctrine:

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

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


2 commentaires

Est-ce que cela fonctionnera si vous dites quelque chose = 'Test_var'? J'essaie d'obtenir des méthodes de getter pour travailler avec des noms de champ qui ont des traits de soulignement, mais cela ne fonctionne pas. Aucune suggestion?


@Shivaas Essayez avec gettestvar pour test_var



5
votes

Ceci 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;

  }

}


0 commentaires