2010-11-28 4 views
3

J'utilise ce tutoriel comme base pour un projet basé sur Code Igniter/Doctrine.Comment définir un mutateur personnalisé avec Doctrine YAML Schema?

http://www.phpandstuff.com/articles/codeigniter-doctrine-scratch-day-3-user-signup-form

Au lieu d'utiliser le code tel quel pour les modèles, mon projet utilise un fichier de schéma YAML pour générer les modèles

J'ai frappé un accroc dans la mesure où j'ai aucune idée de la façon de représenter les éléments suivants en utilisant YAML:

$this->hasMutator('password', '_encrypt_password'); 

(ceci est du code modèle de l'utilisateur, sous la rubrique « Ajout Mutators ») Plus précisément, je vais avoir des problèmes avec le $ this-> hasMutator ligne

J'ai googlé jusqu'à bleu, la documentation recherchée pour Doctrine, Symfony (que je sais utilise Doctrine fortement) et même grep'd la base de code pour les références à muteurs - Je suis venu vide

est-il un moyen pour représenter la ligne $ this-> hasMutator ('password', '_encrypt_password'); en utilisant Doctrine YAML?

Répondre

1

(Juste une note à clarifier: nous parlons de Doctrine 1.x ici et non de Doctrine 2.x) Non, il n'y a pas moyen de définir des mutateurs directement dans votre schéma YAML. Êtes-vous sûr de devoir enregistrer le mutateur?

Vous pouvez contourner cette limitation en créant votre propre comportement de doctrine. Les comportements Doctrine peuvent être affectés à vos modèles dans le schéma YAML. En savoir plus ici:

http://www.doctrine-project.org/projects/orm/1.2/docs/manual/behaviors/pl

Dans votre cas, le comportement ressemblerait à quelque chose comme ceci:

class EbonhandsTemplate extends Doctrine_Template 
{ 
    public function setUp() 
    { 
     $this->hasMutator('password', '_encrypt_password'); 
    } 

    public function _encrypt_password 
    .... 
} 

Et dans votre schéma YAML:

EbonhandsModel: 
    actAs: [EbonhandsTemplate] 
+0

Merci Olof - ce n'est pas tout à fait la solution que je Looki ng pour, mais c'est aussi proche que je vais avoir! – ebonhand

0

Je fini par résoudre ce par ajouter une nouvelle méthode au modèle User.php généré comme suit:

public function setPassword($pass) 
{ 
    $this->_set('password', $this->_encrypt_password($pass)); 
} 

Il obtient le même résultat final que le tutoriel lié ci-dessus (par ex. permettre des modifications au schéma de modèle d'utilisateur via YAML sans perte de code), mais ne semble pas aussi élégant ou polyvalent.

Je marque la réponse de Olof comme correct/accepté, comme sa solution se sent plus extensible et OO - le mien « sent » un peu

0

Il y a une chose importante à noter à propos muteurs si vous chargez des données à partir des fichiers YAML .

Comme dans tutorial vous avez mentionné si votre classe User est comme:

class User extends ModelBaseUser 
{ 
    public function setUp() { 
     parent::setUp(); 
     $this->hasMutator('password', '_encryptPassword'); 
    } 

    protected function _encryptPassword($value) { 
     $salt = $this->_get('salt'); 
     $this->_set('password', md5($salt . $value)); 
    } 
} 

et vous en utilisant loadData() pour remplir la base de données à partir du fichier YAML assurez-vous que vous chargez champ de sel d'abord comme indiqué ci-dessous:

ModelUser: 
    User_Admin: 
     username: admin 
     salt: $secret_ 
     password: adminPa$$ 
     email: [email protected] 

au lieu de:

ModelUser: 
    User_Admin: 
     username: admin 
     password: adminPa$$ 
     salt: $secret_ 
     email: [email protected] 
Questions connexes