我的背景是在Propel中,所以我希望在Doctrine_Record(sfDoctrineRecord)中覆盖一个神奇的getter是一件简单的事情,但是我得到了一个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实例上扩展/覆盖方法的正确Doctrine方法是什么(通过sfDoctrineRecord扩展Doctrine_Record)?这必须是可行的......或者我应该查看模板文档?
谢谢, 布赖恩
答案 0 :(得分:8)
不确定你想做什么完全,但这里有一些提示:
Doctrine(启用了ATTR_AUTO_ACCESSOR_OVERRIDE
属性,symfony启用了 >)允许您通过在模型中定义getColumnName
方法来覆盖某些组件列的getter类。这就是为什么你的getDisplayName
方法会导致无限循环,这通常会导致段错误。
要直接访问/修改列值(绕过自定义(get | set)ters),您必须使用_get('column_name')
类定义的_set('column_name')
和Doctrine_Record
方法。
所有$obj->getSomething()
,$obj->something
和$obj['something']
来电都是神奇的。它们被“重定向”到$obj->get('something')
,这只是真正的方式来访问模型数据。
答案 1 :(得分:7)
尝试_get和_set方法。
答案 2 :(得分:5)
这有效:
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;
}
}
答案 3 :(得分:2)
配置Doctrine:
$manager->setAttribute(Doctrine::ATTR_AUTO_ACCESSOR_OVERRIDE, true);
然后:
public function getAnything()
{
return $this->_get('anything');
}
public function setAnything()
{
return $this->_set('anything', $value);
}