2010-12-08 60 views
3

我在我的symfony项目中为我的所有实例类都有的一些实例类添加了一些功能。如果我对编辑核心symfony安装没有任何疑问,我会直接将我的方法添加到sfDoctrineRecord类中。但我不想这么做,当然,因为我的更改会因升级而中断,再加上我的更改不会很好地适用于其他项目。在symfony中扩展sfDoctrineRecord

如果我想为symfony中的所有实例类添加某些功能,那么“正确”的方法是什么?

(PS当我说“实例类”,我的意思是这样lib/model/doctrine/Customer.class.php。)

回答

6

步骤:

  1. 创建myDoctrineRecord

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

    我放在LIB /记录这个文件,但你可以把它放在任何地方了自动加载器会看到它。

  2. 设置的Symfony使用这个类在ProjectConfiguration的configureDoctrine回调:

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

这就是它! Symfony不是很棒吗? :)

+2

太棒了。这正是我所期待的。出于某种原因,它不适用于我,但这是另一个问题的另一个问题。对于任何好奇的人来说,关于这方面的官方文档在这里:http://www.symfony-project.org/doctrine/1_2/en/03-Configuration – 2010-12-08 21:40:51

2

我认为正确的方式很可能是一个Doctrine_Template添加到有问题的车型,但是你需要把它定义对于每一个模型在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 
    } 
} 

一个行为,然后在你的schema.yml:

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

后您rebui LD你应该能够调用:

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

学说模板和听众比这更强大。你应该看看documentation体面概述