2010-09-16 4 views
2

J'ai une classe de modèle (évidemment, elle étend Doctrine_Record) qui "agit comme" un modèle personnalisé.Doctrine 1.2: Substitution de Doctrine_Record :: __ get() à partir d'un modèle

Je veux obtenir des valeurs comme ceci: "echo $ record-> virtual_field". Existe-t-il un moyen de remplacer la méthode getter dans mon modèle personnalisé pour fournir une réponse personnalisée, puis transmettre la requête à la classe parente ou non? En d'autres termes, existe-t-il un moyen de surcharger Doctrine_Record :: __ get() à partir d'un modèle associé?

+0

+1 pour cette bonne question. Mais qu'est-ce que vous entendez exactement par «effacer le champ»? – greg0ire

+0

Eh bien, je pense qu'une meilleure chose à dire serait "Si je trouve un appel vitrual_field, n'appelez pas le parent __get()" – mattalxndr

Répondre

1

Ok. Je suppose que vous ne parlez pas de modèles de comportement actA réels.

Si vous définissez une nouvelle méthode __get(), elle remplacera automatiquement la méthode __get() du parent.

Maintenant dans votre nouvelle méthode __get(), vous vérifiez d'abord si elle existe dans votre instance actuelle, puis celle du parent.

Je piraté cela ensemble (gardez à l'esprit, il est presque minuit):

<?php 
class bar { 
public $data = array(); 
    public function __construct() { 
    $this->data['virtual_field'] = "set in bar"; 
    } 

    public function __get($name) { 
    if(array_key_exists($name, $this->data)) { 
     return $this->data[$name]; 
    } 
    return null; 
    } 

    public function __set($name, $value) { 
    $this->data[$name] = $value; 
    } 
} 

class foo extends bar { 
public $data = array(); 
    public function __construct() { 

    } 

    public function __get($name) { 
    if(array_key_exists($name, $this->data)) { 
     return $this->data[$name]; 
    } 
    if (parent::__get($name)) 
     return parent::__get($name); 

    return null; 
    } 

    public function __set($name, $value) { 
    $this->data[$name] = $value; 
    } 
} 

$a = new foo; 
echo $a->virtual_field; 

Maintenant, je ne sais pas comment cela fonctionne bien pour ce que vous essayez d'atteindre.

+0

Je parle de comportements Doctrine, pas les classes de modèles eux-mêmes. Je veux ajouter un champ virtuel (comme "virtual_field" dans votre exemple) à plus d'un modèle à la fois en mettant la fonctionnalité dans une classe de modèle (qui fait partie d'un comportement). – mattalxndr

+0

Ok. Je pense maintenant que je comprends ce que vous essayez de faire. Vous voulez remplacer Doctrine_Record :: __ get() par un Doctrine_Template, n'est-ce pas? Maintenant, c'est un dur;) Ne tenez pas compte de ma réponse, désolé. –

-1
class Product extends Doctrine_Record { 

    //... 

    public function __get($name) { 
     if ($name == 'virtual_field') { 
      return $this->virtual_field(); 
     }              
     else { 
      return parent::__get($name); 
     } 
    } 


    public function virtual_field() { 
     // calculate or retrieve virtual field value 
     return $value; 
    } 
} 
+0

Qu'essayez-vous de traverser ici? Je vous suggère de lire à nouveau la question et la réponse acceptée. – mattalxndr

+0

Exactement ce que vous avez dit dans un commentaire précédent: "Eh bien, je suppose qu'une meilleure chose à dire serait« Si je trouve un appel vitrual_field, n'appelez pas le parent __get() '" –

+0

Droit. Puis j'ai dit: "Je parle des comportements de Doctrine, pas des classes de modèles, je veux ajouter un champ virtuel (comme" virtual_field "dans votre exemple) à plus d'un modèle à la fois en mettant la fonctionnalité dans une classe de template (qui fait partie d'un comportement). " – mattalxndr

Questions connexes