在symfony中扩展sfDoctrineRecord

时间:2010-12-08 19:34:14

标签: symfony1 doctrine

我已经在我的symfony项目中的一些实例类中添加了一些功能,我希望我的所有实例类都具有这些功能。如果我对编辑核心symfony安装没有任何疑虑,我只需将我的方法直接添加到sfDoctrineRecord类。但是我当然不希望这样做,因为我的更改会在升级时中断,而且我的更改不会很好地移植到其他项目中。

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

(P.S。当我说“实例课”时,我的意思是lib/model/doctrine/Customer.class.php。)

2 个答案:

答案 0 :(得分:6)

步骤:

  1. 创建myDoctrineRecord

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

    我将此文件放在lib / record中,但您可以将其放在自动加载器可以看到的任何位置。

  2. 设置Symfony以在ProjectConfiguration的configureDoctrine回调中使用此类:

     public function configureDoctrine(Doctrine_Manager $manager)
     {
       sfConfig::set('doctrine_model_builder_options', array('baseClassName' => 'myDoctrineRecord'));
     }
    
  3. 就是这样! Symfony不是很棒吗? :)

答案 1 :(得分: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

重建后,您应该可以致电:

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

当然,Doctrine模板和监听器比这更强大。你应该看看documentation的体面概述