Doctrine PHP Symfony での Doctrine_Record (sfDoctrineRecord) インスタンス メソッドのオーバーライド
-
24-09-2019 - |
質問
私のバックグラウンドは 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メソッドを試してみてください。
他のヒント
何がしたかったのかよくわからない その通り, 、しかしここにいくつかのヒントがあります:
教義(と
ATTR_AUTO_ACCESSOR_OVERRIDE
属性が有効になっており、 は symfony によって有効になります)を定義するだけで、特定のコンポーネント列のゲッターをオーバーライドできます。getColumnName
モデルクラスのメソッド。だからこそ、あなたのgetDisplayName
このメソッドは無限ループに陥り、通常はセグメンテーション違反を引き起こす可能性があります。列値に直接アクセス/変更するには (カスタム (get|set)ter をバイパスして)、次を使用する必要があります。
_get('column_name')
そして_set('column_name')
によって定義されたメソッドDoctrine_Record
クラス。全ての
$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);
}