sfFormを楽して可読性を向上させる

1週間ぐらいsfFormと向き合っているにもかかわらず、仲良くなれてない。一通り使うまでしょうがないとわかりつつ。。

そして、symfonyの学習コストは確実にあがっていっている気がする。
ただし、プログラマとしてsymfonyのソースを読み解いたり、実装を理解するのは楽しいもんです。

話がそれそうなので本題。

symfonyの新しいフォームフレームワークとして登場したsfFormですが、なかなか面倒です。
決して楽ができるわけではないというところが痛いところです。

なので、symfonyで開発日記で紹介されているsfFormatasticPluginは導入したほうが良いです。


sfFormtasticPluginを使えばこのようにFormクラスを比較的簡単にYAMLで作り出すことが出来ます。また、Actionクラスは自分でFormクラスを書いていた時と全く同じです。sfFormtasticPluginを使うからといって、Actionクラスに手を入れる必要はありません。

ただし、build-formで作成したクラスや上記で作成したFormクラスをそのまま使うことはほとんどなく拡張クラスにて設定を上書きしたりすることになります。
そのときに、自動生成されたFormクラスのソースをコピペして変更したりするとソースの可読性が落ちてしまいます。

というのも、yamlの設定では項目ごとに記述しているのに、ソースでは項目ごとではなく、setterを使ってwidget毎やvalidator毎のメソッドに集約されてしまっているからです。

    $this->setWidgets(array(
      ‘mail’     => new sfWidgetFormInput,
      ‘password’ => new sfWidgetFormInputPassword,
    ));

    $this->setValidators(array(
      ‘mail’     => new sfValidatorString(array(), array(‘required’ => ‘メールアドレスは必須です’)),
      ‘password’ => new sfValidatorString(array(‘min_length’ => 6), array(‘min_length’ => ‘パスワードは6文字以上で設定してください’, ‘required’ => ‘パスワードは必須です’)),
    ));

というわけで、拡張クラスで項目の設定を変更するときは項目名を$keyなどの変数にいれておいて、以下のようなコーディングで項目毎の設定をconfigure()メソッド内に書くようにしています。

    //--------------------------------------------------//
    // mail
    $key = 'mail';
    $this->widgetSchema[$key] = new sfWidgetFormInput();
    $this->widgetSchema->setLabel($key, 'メールアドレス');
    $this->widgetSchema->setHelp($key, 'PCのメールアドレスを入力してください');
    // $this->widgetSchema[$key]->setHidden(true);  // フォームをhiddenにする場合
    $this->validatorSchema[$key] = new sfValidatorString();
    $this->validatorSchema[$key]->setOption('required', true);
    $this->validatorSchema[$key]->setMessage('required', 'メールアドレスは必須です');
    //--------------------------------------------------//
    // password
    $key = 'password';
    $this->widgetSchema[$key] = new sfWidgetFormPassword();
    $this->widgetSchema->setLabel($key, 'パスワード');
    // $this->widgetSchema->setHelp($key, '');
    // $this->widgetSchema[$key]->setHidden(true);  // フォームをhiddenにする場合
    $this->validatorSchema[$key] = new sfValidatorString();
    $this->validatorSchema[$key]->setOption('required', true);
    $this->validatorSchema[$key]->setMessage('min_length', 'パスワードは6文字以上で設定してください');
    $this->validatorSchema[$key]->setOption('min_length', 6);
    $this->validatorSchema[$key]->setMessage('required', 'パスワードは必須です');

この書き方でさきほどの書き方と同じ機能が実装されます。
メリットは

  • 項目毎の設定がわかりやすい。(arrayから可能な限り解放される)
  • 不要な機能はコメントアウトすればいい
  • 機能を追加、変更したい場合は行単位のコピペで対応できる

もちろんデメリットは行数が増える*1。。ですが、メンテナンス性では向上すると思いますがいかがでしょ?

*1:$r = $this->validatorSchema[$key] のようにリファレンス変数を用意するのもありですね