1

私の Symfony プロジェクトでは、データ フォームを管理するための新しい戦略を使用します。

Symfony Form オブジェクトを使用したくありませんが、モデルを使用してそれらを構築したいと考えています。

Base Doctrine_Record クラスを再宣言したくないので、新しい Doctrine_Template: ExtendedModel を書きました。

ExtendeModel テンプレートには新しいオブジェクトとメソッドがありますが、Doctrine_Record の validate() 関数をオーバーライドする必要があります。

で試しました

class ExtendedModel extends Doctrine_Template {

[...]

public $validatorSchema;

public function setValidatorSchema(sfValidatorSchema $validatorSchema) {
    $this->validatorSchema = $validatorSchema;
}

public function getValidatorSchema() {
    return $this->validatorSchema;
}

public function validate() {
    $this->getInvoker()->setup();

    $errorStack = $this->getInvoker()->getErrorStack();
    if ($this->getValidatorSchema()) {
        try {
            $this->getValidatorSchema()->addOption('allow_extra_fields', true);
            $this->getValidatorSchema()->clean($this->getInvoker()->toArray(false));
        } catch (sfValidatorErrorSchema $errorSchema) {
            $errorStack = $this->getInvoker()->getErrorStack();
            foreach ($errorSchema->getErrors() as $key => $error) {
                /* @var $error sfValidatorError  */
                $errorStack->add($key, $error->getMessage());
            }
        }
    }
    $this->getInvoker()->validate();
}

}

しかし、Doctrine はオリジナルの validate() 関数を使用します。

Doctrine_Template に宣言された新しいメソッドでいくつかの Doctrine_Record 関数をオーバーライドしたいと考えています。

この問題の解決策を教えてください。

Tnx!

4

1 に答える 1

1

__callテンプレートは Doctrine_Record メソッドをオーバーライドしません。これらは、ネイティブ メソッドが見つからない場合にPHP マジック メソッドを介して呼び出されるフォールバックにすぎません。

これを行うには、Doctrine_Record 継承チェーンに独自のクラスが必要です。幸いなことに、これは非常に簡単です。

1. myDoctrineRecord を作成する

abstract class myDoctrineRecord extends sfDoctrineRecord
{
   public function commonRecordMethod() { }
}

このファイルを lib/record に配置しますが、オートローダーが認識できる場所ならどこにでも配置できます。

2. ProjectConfiguration の configureDoctrine コールバックでこのクラスを使用するように Symfony を設定します。

public function configureDoctrine(Doctrine_Manager $manager)
{
   sfConfig::set('doctrine_model_builder_options', array('baseClassName' => 'myDoctrineRecord'));
}

これは、以前の回答から同様の質問へのコピー/貼り付けです。モデルも再構築する必要があります。

于 2010-12-21T14:37:03.593 に答える