8

我的背景是在 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)?这必须是可行的......还是我应该查看模板文档?

谢谢,布赖恩

4

4 回答 4

9

不确定您到底想做什么,但这里有一些提示:

  1. Doctrine(ATTR_AUTO_ACCESSOR_OVERRIDE启用了属性,symfony 启用)允许您仅通过getColumnName在模型类中定义方法来覆盖某些组件列的 getter。这就是为什么您的getDisplayName方法可能会陷入无限循环,这通常会导致段错误。

  2. 要直接访问/修改列值(绕过自定义 (get|set)ters),您必须使用类定义的_get('column_name')方法。_set('column_name')Doctrine_Record

  3. 所有的$obj->getSomething(),$obj->something$obj['something']调用实际上是神奇的。它们被“重定向”到这是访问模型数据$obj->get('something')的唯一真实方式。

于 2010-04-06T19:58:54.417 回答
8

尝试 _get 和 _set 方法。

于 2010-04-06T19:17:12.770 回答
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;

  }

}
于 2010-04-06T21:12:42.577 回答
2

配置原则:

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

然后:

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

public function setAnything()
{
    return $this->_set('anything', $value);
}
于 2010-04-06T20:01:32.047 回答