Catalystが気持ち悪い件 / FormValidatorプラグイン

| コメント(0) | トラックバック(0)



さて、実際にまじめに使ってみて、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;


Author

Daisuke Maki (a.k.a lestrrat): Perl hacker, Director of Japan Perl Association, YAPC::Asia Tokyo Organizer (2009-2012), Fluent in Japanese, English. Ex-Brazilian (sorta)

#perl #c #ruby #java #mysql #english #japanese #opensource #stf #cooking #scotch #cigar


このエントリーをはてなブックマ
ークに追加

翔泳社よりモダンPerl入門(2010)を出版させていただいております。できれば内容をアップデートしたいので是非皆様・・・現在の在庫処理にお力をお貸しください!><

月別アーカイブ