FormValidatorまわりのPluginの仕様

Pluginの仕様を考えると、Validationをどこでするのか、validation error時の表示方法、formの受け渡し方あたりが考えどころだなぁと。catalystのcontrollerでstash介してform渡す仕様は、どうも直感的じゃないので違う形で実現したいなと

Validationのする場所

Formのvalidationまわりもactionベースでvalidation対象を決めて、actionが実行される前にチェックをして、Controller側ではエラーがあったらそのerrorとともにviewを表示させるというものがPerlフレームワークでは多いように思う。

これはCatalyst::Controller::HTML::FormFuやCatalyst::Plugin::FormValidator::Simple::Autoでやられている方法。actionが実行される前にルールにもとづいてvalidationしておくという仕組みはどちらも同じだ。これは結構いいんじゃないかなぁと。

一方、Ruby周りのフレームワークRailsの影響も大きいのか、ModelにValidationロジックをもたせるので、validationのタイミングが違う。Controllerレベルではなく、Modelレベルでvalidationが行われる。

個人的にはControllerでのValidationのほうが扱いやすいケースが多いんじゃないかという気がしていて、それはフォームとモデルが必ずしも1:1にならないケースって意外とあるんじゃないかと思っているから。

バリデーションエラーの扱い

HTML::FormFuとFormValidator::Simple系ではエラーの扱いは若干違う。

Catalyst::Controller::HTML::FormFu側では特殊なタグで埋め込む形にして、そいつにエラー時のコード生成までするって形になっている。HTMLを手書きにすれば、FormValidator系のような仕様になって、エラーをControllerからViewに渡して、それをエラーを処理するコードを人手で書くってことになる。

最近はHTML::FormFuっぽく扱って、formのhelperを提供して手でかかせる形にするのがいいのかなという気がしてきた。利用者からすると、formかいておけば、validation時のエラーまで面倒見てくれて、後はCSS調節するだけになる。このほうがユーザーが決めなければいけないことが少ない。ユーザーがformの書き方だけ覚えればいいだけで、コーディング量も大分少なくなる。

validation済みformデータの受け渡し方

ここがいまいち、どうしたら綺麗なのかがわからないところ。ここさえ決まれば、後はさくっといけそう。

Catalyst系のController拡張のValidatorは$c->stash->{form} のようにformをstashにいれて渡すのだけど、綺麗でないうえに、直感的なAPIでもないので、どうしたら綺麗になるんだろうなぁと少し考え中。

そもそも、エラーがあるかをユーザー側に意識させないフレームワークのほうがいいのかなぁ。errorがあったらaction実行させないで、formのerror画面に戻しちゃうとか。