symfony1.1使いに役立つかもしれないsfFormについての知識

みなさんsymfony 1.1を使ってますか?symfony 1.1ではFormとvalidateの仕組みがsfFormクラスに変更されました。

sfFormは「自称もっとも美しいPHPのFormフレームワーク」と言うだけあって良くできています。symfony1.0の頃にあった「Actionクラスに内包されているがゆえの気持ち悪さ」はありません。ただ、使っているとどうも「validationをYAMLで書きたい」という話を多く聞きます。確かにsfFormを使っているとsfFormから派生したFormクラスにフォームの定義やオプション、validateの内容など同じようなことを何度も書かなければならず、スマートとは言い難いです。

そこで今回紹介するのは、「sfFormって面倒じゃない?」問題を解決するsfFormtasticPluginです。

sfFormtasticPluginはsfFormを継承して作るFormクラスをYAMLからジェネレートするpluginです。簡単に動作を説明すると

  1. ActionクラスからFormクラスがnewされる
  2. newしたFormクラスが存在しない場合、sfFormtasticPluginに含まれるautoloadが実行される
  3. プロジェクトのcacheディレクトリの下に対応するYAMLから呼び出したFormクラスが生成される

となります。

では実際の使い方です。まずはプラグインのインストールを行います。今のところplugin:installは使えないのでsvnコマンドを使いリポジトリから持ってきましょう。

cd project_dir
svn co http://svn.symfony-project.com/plugins/sfFormtasticPlugin/trunk plugins/sfFormtasticPluin
./symfony cc

pluginsディレクトリの下に入れた後は、いつも通りsymfony ccコマンドでキャッシュをクリアするのを忘れないでください。以上で準備は完了です。

次にフォームの生成です。今回は簡単な例として以下のようなフォームを作ってみます。

  • mail, passwordという二つのテキストフィールドを持つ
  • 両フィールドとも必須
  • mailフィールドはsfValidatorEmailでメールアドレスか判定する
  • passwordフィールドはsfValidatorStringを使い6文字以上か判定する

YAMLはアプリケーションディレクトリのconfigディレクトリの下にformディレクトリを作り、その下に作ります。例えば

 apps/frontend/config/form/login.yml

このようになります。YAMLのファイル名は自分がわかりやすければ何でもいいようです。実際の記述内容は以下のようになります。

LoginForm:
  name_format: login[%s]
  fields:
    mail:
      required:
        msg: メールアドレスは必須です
      sfValidatorString:
    password:
      required:
        msg: パスワードは必須です
      sfValidatorString:
        min_length:       6
        min_length_error: パスワードは6文字以上で設定してください

1行目に書いたLoginFormがクラス名になります。このYAMLがどんなクラスになるかは、実際にcacheディレクトリの下に出来るファイルを見てみるのが早いでしょう。

class LoginForm extends sfFormtastic
{
  /**
   * @see sfForm
   */
  public function configure()
  {
    $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' => 'パスワードは必須です')),
    ));
 
    $this->widgetSchema->setNameFormat('login[%s]');
 
  }
}

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

validateはやっぱりYAMLで管理したいんだよなー、とsymfony1.1を避けていた人もこれを機にsymfony1.1を使ってみてはどうでしょうか。

Leave a Reply

Name (required)
Mail (will not be published) (required)

Your Comments:

Spam Protection by WP-SpamFree