Мой фон находится в 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 методы.
Не уверен, что вы хотели сделать точно , но вот несколько советов:
Doctrine (с ATTR_AUTO_ACCESSOR_OVERRIDE
атрибутом ATTR_AUTO_ACCESSOR_OVERRIDE
, который активируется symfony) позволяет вам переопределять геттеры определенных столбцов компонента, просто определяя методы getColumnName
в классе модели. Вот почему ваш метод getDisplayName
может падать бесконечным циклом, который обычно вызывает segfault.
Для непосредственного доступа / изменения значения столбца (в обход пользовательских (get | set)) вам необходимо использовать _get('column_name')
и _set('column_name')
определенные классом Doctrine_Record
.
Все $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); }