トミールの技術系日記

忍たまはじめました

FormValidator::Lite 0.22

http://frepan.org/~tokuhirom/FormValidator-Lite-0.22/

いくつか取り込んでもらいました。tokuhirom++

いま某原稿で*1、基本いままでつかったことあるモジュールの説明を書いたりしているのだけど、テストアプリを書きつつ使ってない奴も検証して進めている。

webappのフォームバリデータ

はどうしようか、を考えていて、いくつか案はあったのだけどどれ一つグッと来るものがない。なおこれをやっているときに生牡蠣でノロにあたった。きつかったです。

  • HTML::FormFuタイプではなく、Requestに条件をぶつけるタイプで考える
  • Required、URL、Email、数字が最初から含まれている
  • カタカナ、ひらがなチェックを含んでいること(pluginでもよい)
  • ちょっとしたオリジナル条件をCodeRefで指定できる
  • チェックする前にtrimできる。もしくはその仕組み。
  • エラーテキストのセット
  • かんたんに説明できること(←重要)

検討したのはこんなところ。

これは2011/1月確認した時の話である。

  • FormValidator::Simple: 問題ないのだが、簡単なオリジナル条件を追加するのがめんどい。あとF::S::P::Japaneseが2006年を最後であり、いまだJcodeを使ってるというのがいろいろを語っている。
  • Data::FormValidator: 見た中では一番よい。requiredが他の条件と別なのはわかりやすい。filterがあるのもよい。ただ大量に関数エクスポートしてねという方式のconstraint_methodsより(古いスタイルとされる)constraintの方がぜったいいいだろ。validator_packagesとの組み合わせもいいし。ただ、日本語まわりのD::F::C::Japaneseがありえないほど古いコードである。(驚きのEncode::Detect。bytes/string混乱期のままだ。)あと、標準でURLチェックがない。RE_HTTP_URLを使えというのか。それhttps対応してないし。つうかRegexp::Commonは便利そうな風をしておいて実は使いにくいので嫌いだ
  • Brannigan: なかなかいいねえ。自由度があって。しかしURLとかEmailとか全部自分で書かないといけないのか。。。F::S発のように条件が大文字名ってのは今は小文字の方がかっこいいかも?と思ったのだけど、これのPOD見てフィールド名と明らかに違うとわかりやすいのだなと感じた。
  • FormValidator::Lite(バージョン0.21について): 速度は認めよう。F::Sを改良すればよいのではないかという気もするが、F::Sはたくさんに使われすぎているのでAPIはいじれないだろうし。これは(人のこと言えないが)PODがてきとうである。あとEmailがlooseしかないとか、やっつけ感が残っている気がする。
  • Data::RuledValidator: なんかわが道をいっている。個人的にはきらいじゃないよこのスタイル。ダミアン先生が好きそうだ。
  • Validator::Custom: 上記らと違いがわからない。こういう後発のものは、PODにモチベーションとかRelated Modulesセクションがあると良いとおもう。あと日本語系とかのプラグイン的なのは新たにつくるひつようがある。
  • もはやData::Validateみたいなチェック系をかってにくみあわせる?
  • なんとかX::Validator(MojoX::Validatorとか): 専用のは除外

うーむ、まさに一長一短である

YAMLのように実装が複数あるものもあるが、まったく同じことをしようとしているのにこれだけ実装が分かれているジャンルは1位アクセサ作成モジュール、2位がバリデータではないだろうか。

いずれにしてもどれか使ってみて、気に入らない点はパッチかpluginを書こう。

→ いちばん対応が速そうなFormValidator::Liteにいくつかパッチ、というかforkして改造をしたのを見てもらって今さっき対応してくれたみたいだ。

加えた改造はイカの通り

http://frepan.org/~tokuhirom/FormValidator-Lite-0.22/lib/FormValidator/Lite/Constraint/Default.pm

  • REQUIRED, FILTERの追加: D::Vからの移行が楽そう
  • MATCH: もともと自前チェックを追加しやすいのではあるが、その場でできると他のモジュールの機能を使いやすく良いと思う。
  • EQUAL: REGEXPでも良いのだけど。DUPLICATIONの書き方をよく忘れるので。passwd2 => EQUAL => $req->param('passwd1') と書ける。
  • あと、NOT_BLANKが機能していなかったのを修正

あと手が空けば、PODを丁寧な感じに書き直して、Messages::enちゃんと追加して、USとかで必ず使われるなんか(zipcode?)を追加したりするとよいな。

*1:まだやっている。今正念場です。取り上げる内容にご意見下さった方ありがとうございました。まだもう少し何か意見言いたい、という話は募集中です。メールとかもらえれば現在の目次をお送りします