2010-12-08 35 views
3

J'ai ajouté certaines fonctionnalités à certaines de mes classes d'instance dans mon projet symfony que je veux que TOUTES mes classes d'instance aient. Si je n'avais aucun scrupule à modifier l'installation de base de symfony, j'ajouterais mes méthodes directement à la classe sfDoctrineRecord. Mais je ne veux pas faire cela, bien sûr, parce que mes changements se briseraient lors de la mise à jour, et mes changements ne se porteraient pas bien sur d'autres projets.Extension de sfDoctrineRecord dans symfony

Si je veux ajouter certaines fonctionnalités à toutes mes classes d'instance dans symfony, quelle est la "bonne" façon de le faire?

(PS Quand je dis « classe d'instance », je veux dire quelque chose comme lib/model/doctrine/Customer.class.php.)

Répondre

6

Étapes:

  1. Créer myDoctrineRecord

    abstract class myDoctrineRecord extends sfDoctrineRecord 
    { 
        public function commonRecordMethod() { } 
    } 
    

    je place ce fichier dans le répertoire lib/enregistrement, mais vous pouvez le mettre partout que la autoloader le verra.

  2. Set symfony pour utiliser cette classe dans le rappel de configureDoctrine de votre ProjectConfiguration:

    public function configureDoctrine(Doctrine_Manager $manager) 
    { 
        sfConfig::set('doctrine_model_builder_options', array('baseClassName' => 'myDoctrineRecord')); 
    } 
    

Ca y est! Symfony n'est-il pas génial? :)

+2

Génial. C'est exactement ce que je cherchais. Pour une raison quelconque, cela ne fonctionnera pas pour moi, mais c'est un autre problème pour une autre question. Pour tous ceux qui sont curieux, les documents officiels à ce sujet sont ici: http://www.symfony-project.org/doctrine/1_2/fr/03-Configuration –

+0

ahhhh je pensais que j'avais vu quelque part mais quand je n'ai pas vu un ' Doctrine_Core :: ATTR_ * 'Attribut constant, même si j'étais usé ... Je n'avais aucune idée que c'était dans les options du constructeur. +1 – prodigitalson

+1

Voici ma question sur pourquoi ça ne marche pas: http://stackoverflow.com/questions/4392713/cant-change-model-builder-options –

2

Je suppose que la bonne façon serait sans doute d'ajouter un Doctrine_Template aux modèles en question, mais vous devez définir comme un comportement pour chaque modèle dans votre schema.yml

class MyMethodsTemplate extends Doctrine_Template 
{ 
    public function customMethod1(){ 
     $model = $this->getInvoker(); 
     //do stuff with model 
    } 

    public function customMethod2(){ 
     $model = $this->getInvoker(); 
     //do stuff with model 
    } 
} 

Et puis dans votre schema.yml:

ModelName: 
    actAs: 
    MyMethodTemplate: ~ 
    # the rest of your definition 

Après rebui ld vous devriez être en mesure d'appeler:

$model = new ModelName(); 
$model->customMethod1(); 
$model->customMethod2(); 

Bien sûr les modèles de la doctrine et les auditeurs sont beaucoup plus puissants que cela. Vous devriez jeter un oeil à la documentation pour un aperçu décent