2010-04-06 5 views
8

Mon arrière-plan est dans Propel, alors j'espérais que ce serait une chose simple de surcharger un getter magique dans un Doctrine_Record (sfDoctrineRecord), mais je reçois soit un Segfault ou la méthode override est simplement ignorée en faveur de celle de la superclasse.Substitution des méthodes d'instance Doctrine_Record (sfDoctrineRecord) dans Doctrine PHP Symfony

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 sfDoctrineRecord étend Doctrine_Record)? Cela doit être faisable ... ou dois-je regarder la documentation du modèle?

Merci, Brian

Répondre

7

méthodes Essayez _GET et _set.

+0

Impressionnant, merci. – Brian

8

Je ne sais pas sur ce que vous vouliez faire exactement, mais voici quelques conseils:

  1. Doctrine (avec ATTR_AUTO_ACCESSOR_OVERRIDE attribut activé, ce qui est activé par symfony) vous permet de passer outre certains les getters des colonnes de composants en définissant simplement les méthodes getColumnName dans la classe de modèle. C'est pourquoi votre méthode 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 _get('column_name') et _set('column_name') méthodes définies par Doctrine_Record classe. Tous les appels $obj->getSomething(), $obj->something et $obj['something'] sont réellement magiques. Ils sont "redirigés" vers $obj->get('something') qui est seulement réel façon d'accéder aux données du modèle.

+0

Merci pour l'info sur ATTR_AUTO_ACCESSOR_OVERRIDE; maintenant je vois où dans Doctrine_Record est vérifié avant de renvoyer la valeur du champ. -br – Brian

2

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); 
} 
+0

Est-ce que cela fonctionnera si dire Anything = 'test_var'? J'essaie de faire en sorte que les méthodes getter fonctionnent avec les noms de champs qui ont des traits de soulignement mais d'une manière ou d'une autre cela ne fonctionne pas. Aucune suggestion? – Shivaas

+0

@Shivaas Essayez avec 'getTestVar' pour' test_var' – takeshin

+0

Je vais essayer! Merci d'aider. – Shivaas

5

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; 

    } 

} 
+1

+1 cela fonctionne parfaitement bien avec Doctrine 1.2 – Benoit

Questions connexes