在Doctrine PHP Symfony中重写Doctrine_Record(sfDoctrineRecord)实例方法

时间:2010-04-06 17:57:17

标签: php symfony1 doctrine extending getter-setter

我的背景是在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 个答案:

答案 0 :(得分:8)

不确定你想做什么完全,但这里有一些提示:

  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'),这只是真正的方式来访问模型数据。

答案 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);
}