Расширение sfDoctrineRecord в symfony - PullRequest
3 голосов
/ 08 декабря 2010

Я добавил некоторые функциональные возможности к некоторым из моих экземпляров классов в моем проекте Symfony, которые я хочу, чтобы ВСЕ мои экземпляры классов имели.Если бы у меня не было проблем с редактированием установки ядра Symfony, я бы просто добавил свои методы непосредственно в класс sfDoctrineRecord.Но я не хочу этого делать, конечно, потому что мои изменения будут нарушены при обновлении, плюс мои изменения не будут хорошо переноситься на другие проекты.

Если я хочу добавить определенную функциональность ко всему моему экземпляруклассы в Symfony, каков «правильный» способ сделать это?

(PS Когда я говорю «экземпляр класса», я имею в виду что-то вроде lib/model/doctrine/Customer.class.php.)

Ответы [ 2 ]

6 голосов
/ 08 декабря 2010

Шаги:

  1. Создать myDoctrineRecord

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

    Я помещаю этот файл в lib / record, но вы можете поместить его в любое место, где автозагрузчик его увидит.

  2. Настройте Symfony на использование этого класса в обратном вызове configureDoctrine вашей ProjectConfiguration:

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

Вот и все! Разве Symfony не велик? :)

2 голосов
/ 08 декабря 2010

Полагаю, правильным способом было бы добавить 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 гораздо мощнее этого.Вы должны взглянуть на документацию для приличного обзора

...