みなさん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です。簡単に動作を説明すると
- ActionクラスからFormクラスがnewされる
- newしたFormクラスが存在しない場合、sfFormtasticPluginに含まれるautoloadが実行される
- プロジェクトの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を使ってみてはどうでしょうか。

