Переопределение методов экземпляра Doctrine_Record (sfDoctrineRecord) в Doctrine PHP Symfony

Мой фон находится в Propel, поэтому я надеялся, что было бы просто переопределить магический геттер в Doctrine_Record (sfDoctrineRecord), но я получаю либо метод Segfault, либо метод переопределения просто игнорируются в пользу того, что находится в суперкласс.

https://gist.github.com/697008eaf4d7b606286a

class FaqCategory extends BaseFaqCategory { public function __toString() { return $this->getCategory(); } // doesn't work // override getDisplayName to fall back to category name if getDisplayName doesn't exist public function getDisplayName() { // also tried parent::getDisplayName() but got segfault(!) if(isset($this->display_name)) { $display_name = $this->display_name; } else { $display_name = $this->category; } return $display_name; } } 

Каков надлежащий способ Doctrine для расширения / переопределения методов на экземпляре Doctrine_Record (через sfDoctrineRecord extends Doctrine_Record)? Это должно быть выполнимо … или я должен смотреть документацию по шаблонам?

Спасибо, Брайан

Попробуйте _get и _set методы.

Не уверен, что вы хотели сделать точно , но вот несколько советов:

  1. Doctrine (с ATTR_AUTO_ACCESSOR_OVERRIDE атрибутом ATTR_AUTO_ACCESSOR_OVERRIDE , который активируется symfony) позволяет вам переопределять геттеры определенных столбцов компонента, просто определяя методы getColumnName в классе модели. Вот почему ваш метод getDisplayName может падать бесконечным циклом, который обычно вызывает segfault.

  2. Для непосредственного доступа / изменения значения столбца (в обход пользовательских (get | set)) вам необходимо использовать _get('column_name') и _set('column_name') определенные классом Doctrine_Record .

  3. Все $obj->getSomething() , $obj->something и $obj['something'] самом деле волшебны. Они «перенаправляются» на $obj->get('something') что является реальным способом доступа к данным модели.

Это работает:

 class FaqCategory extends BaseFaqCategory { public function __toString() { return $this->getCategory(); } public function getDisplayName() { if($this->_get("display_name") != "") { $display_name = $this->_get("display_name"); } else { $display_name = $this->getCategory(); } return $display_name; } } 

Настроить Доктрину:

 $manager->setAttribute(Doctrine::ATTR_AUTO_ACCESSOR_OVERRIDE, true); 

тогда:

 public function getAnything() { return $this->_get('anything'); } public function setAnything() { return $this->_set('anything', $value); }