Переопределяющие методы экземпляра записи доктрины (Sfdoctrinerecord) в Symfony PHP доктрины
Мой опыт работы в 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_record (через sfDoctrineRecord расширяет doctrine_record)? Этот должно быть выполнимо... или я должен смотреть документацию по шаблону?
Спасибо, Брайан
4 answers
Попробуйте методы _get и _set.
Не уверен, что именно вы хотели сделать , но вот несколько советов:
Доктрина (с включенным атрибутом
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')
, что является единственным реальным способом доступа к данным модели.
Это работает:
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);
}