8

私のバックグラウンドは 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 のインスタンスでメソッドを拡張/オーバーライドする適切な Doctrine の方法は何ですか? (sfDoctrineRecord を介して Doctrine_Record を拡張します)? これは実行可能である必要があります...または、テンプレートのドキュメントを確認する必要がありますか?

ありがとう、ブライアン

4

4 に答える 4

9

正確に何をしたかったのかはわかりませんが、ヒントをいくつか示します。

  1. Doctrine (ATTR_AUTO_ACCESSOR_OVERRIDE属性getColumnName有効で、symfony で有効になっています) を使用すると、モデル クラスでメソッドを定義するだけで、特定のコンポーネント カラムのゲッターをオーバーライドできます。そのため、getDisplayNameメソッドが無限ループに陥る可能性があり、通常は segfault が発生します。

  2. 列の値に直接アクセス/変更するには (カスタム (get|set)ter をバイパスして) 、クラスで定義されたメソッドを使用する必要が_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 に答える