さて、実際にまじめに使ってみて、Catalystはとてもよく考えられたフレームワークだというのはわかったきた。
だけど、気持ち悪い。Pluginを書いてみるとわかるのだが、なんかimportしただけでContextから使えるようになったりする。これは便利ではあるんだけど、ひじょーに気持ち悪い。勝手に動くってなんか微妙だ。ドキュメントが整備されてない事がやっぱりネックのような。
ちなみに今回書いたのはData::FormValidatorのプラグイン。Catalyst::Plugin::FormValidatorというのもあるんだけど、どうも使いにくいので
- Controllerごとにenable/disableできるようにする
- Data::FormValidator->new($file)に対応する
- ディスパッチされたメソッドに対してどのプロフィールを使うのか指定できる
という命題をクリアする(と思われる)ものを書いた。こんな感じに使う:
package MyApp::Controller::Hoge;
use strict;
use base qw(Catalyst::Controller);__PACKAGE__->config(
'MyApp::Plugin::FormValidator' => {
enable => 1,
profile_file => MyApp->path_to('misc/profile.pl'),
profile => {
index => 'index_check', # profile name
another_action => { # Data::FormValidator args
...
}
}
}
);sub index : Local {
my($self, $c) = @_;# この時点ですでにパース済み。
my $valids = $c->form->valid;
}
プラグイン本体は以下の通り:
package MyApp::Plugin::FormValidator; use strict; use Data::FormValidator;sub prepare
{
my $c = shift;
$c = $c->NEXT::prepare(@_);
my $pkg = __PACKAGE__;
my $config = $c->action->class->config->{$pkg};
if ($config->{enable}) {
if (my $profile = $config->{profiles}->{ $c->action->name }) {
# check if we're instantiating from a file
my $dfv;
if (my $profile_file = $config->{profile_file}) {
$dfv = Data::FormValidator->new("$profile_file");
} else {
$dfv = 'Data::FormValidator';
}
$c->stash->{form} = $dfv->check($c->request->parameters, $profile);
}
}return $c;
}sub form
{
my($c) = @_;
return $c->stash->{form};
}1;