Мое образование находится в, Продвигают, таким образом, я надеялся, что это будет простая вещь переопределить волшебный метод считывания в 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_Record (через sfDoctrineRecord расширяет Doctrine_Record)? Это должно быть выполнимо..., или я должен смотреть на Шаблонную документацию?
Спасибо, Brian
Настроить доктрину:
$manager->setAttribute(Doctrine::ATTR_AUTO_ACCESSOR_OVERRIDE, true);
затем:
public function getAnything()
{
return $this->_get('anything');
}
public function setAnything()
{
return $this->_set('anything', $value);
}
Это работает:
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;
}
}
Не уверен в том, что вы хотели сделать именно, но вот несколько подсказок:
Doctrine (с включенным атрибутом ATTR_AUTO_ACCESSOR_OVERRIDE
, который включен в symfony) позволяет вам переопределять геттеры определенных колонок компонента, просто определив методы getColumnName
в классе модели. Поэтому ваш метод getDisplayName
может попасть в бесконечный цикл, что обычно вызывает segfault.
Чтобы получить доступ/изменить значение колонки напрямую (минуя пользовательские (get|set)ters), вы должны использовать методы _get('column_name')
и _set('column_name')
, определенные в классе Doctrine_Record
.
Все вызовы $obj->getSomething()
, $obj->something
и $obj['something']
на самом деле являются магическими. Они "перенаправляются" на $obj->get('something')
, который является единственным реальным способом доступа к данным модели.