sfForm(BaseForm)派生クラス内でのsetup()やconfigure()についてのメモ

sfFormの派生クラス、例えばモデルクラスに対応するフォームクラスなどで、setup() メソッドが使われています。Base〜というクラスの setup() メソッドにデフォルトのウィジェットなどが定義され、このクラスを継承するクラスの configure() メソッドでウィジェットをカスタマイズしたりできます。

また、setup() メソッドの末尾には parent::setup() の呼び出しがあるので、BaseForm クラスに setup() メソッドを追加することで、すべてのフォームに共通する処理を記述することができます。


しかし、多少のルールを知っておかないと、意図したように処理されません。

setup()→configure()の順番

この順で呼び出されます。

$this->setWidgets() や $this->setValidators() はすべてを書き換える

これらのメソッドの実装コードを見ると分かりますが、それぞれウィジェットスキーマオブジェクト、バリデータースキーマオブジェクトが新規にインスタンス化され、既存のものと置き換わります。
つまり、このメソッドを呼ぶ以前にウィジェットスキーマオブジェクトに対して設定していた情報は失われるということです。

例:

  • Base〜のsetup()メソッド内で、$this->setWidgets()を利用してウィジェットが設定されていて、派生クラスにもsetup()メソッドを定義して、i18n辞書を適用する場合:
<?php
  public function setup()
  {
    parent::setup();
    $this->widgetSchema->getFormFormatter()->setTranslationCatalogue('sf_guard');
  }

↑のコードだと設定が正しく反映されますが、

<?php
  public function setup()
  {
    $this->widgetSchema->getFormFormatter()->setTranslationCatalogue('sf_guard');
    parent::setup();
  }

↑のコードだと、設定が反映されません。親クラスのsetup()メソッドで、一旦ウィジェットスキーマオブジェクトが破棄されてしまうためです。