Doctrine PHP Symfony での Doctrine_Record (sfDoctrineRecord) インスタンス メソッドのオーバーライド

StackOverflow https://stackoverflow.com/questions/2587115

質問

私のバックグラウンドは Propel なので、Doctrine_Record (sfDoctrineRecord) の魔法のゲッターをオーバーライドするのは簡単なことだと期待していましたが、セグフォルトが発生するか、オーバーライド メソッドが単純に無視されて、スーパークラス。

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 を拡張します)。これは実行可能でなければなりません...それともテンプレートのドキュメントを参照する必要がありますか?

ありがとう、ブライアン

役に立ちましたか?

解決

_getと_setメソッドを試してみてください。

他のヒント

何がしたかったのかよくわからない その通り, 、しかしここにいくつかのヒントがあります:

  1. 教義(と ATTR_AUTO_ACCESSOR_OVERRIDE 属性が有効になっており、 symfony によって有効になります)を定義するだけで、特定のコンポーネント列のゲッターをオーバーライドできます。 getColumnName モデルクラスのメソッド。だからこそ、あなたの getDisplayName このメソッドは無限ループに陥り、通常はセグメンテーション違反を引き起こす可能性があります。

  2. 列値に直接アクセス/変更するには (カスタム (get|set)ter をバイパスして)、次を使用する必要があります。 _get('column_name') そして _set('column_name') によって定義されたメソッド Doctrine_Record クラス。

  3. 全ての $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);
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top