Craftworks Tech Blog - Branch このページをアンテナに追加 RSSフィード Twitter

2014-03-11

FormValidator::Lite で Xslate のテンプレートの文法チェックをする方法

| 08:57 | FormValidator::Lite で Xslate のテンプレートの文法チェックをする方法を含むブックマーク FormValidator::Lite で Xslate のテンプレートの文法チェックをする方法のブックマークコメント

そこそこ大きい Web アプリを作ってると非エンジニアに管理画面でテンプレート編集させたりするケースもあると思いますが、文法チェックをしないと、テンプレートレンダリングできないがためにシステムがコケるとかいう悲しい事態が起こったりするので、チェックを通ったもののみ保存したいというニーズもたまにあると思います。

そこで、ヴァリデーターをかましてチェックすることにしてみました。

package MyApp::FormValidator::Constraint;
            
use strict;
use warnings;
use FormValidator::Lite::Constraint;
use Text::Xslate;
use Try::Tiny;
            
our %ErrStr;
my $xslate = Text::Xslate->new;
            
rule 'CAN_RENDER' => sub {
    return try {
        $xslate->render_string($_);
    } catch {
        $ErrStr{'CAN_RENDER'} = $_;
        return 0;
    };
};

1;

こんな Constraint クラスをこしらえて、

FormValidator::Lite->load_constraints(qw/Email +MyApp::FormValidator::Constraint/);

my $validator = FormValidator::Lite->new(...);
$validator->check(
    'template' => [ 'NOT_NULL', 'CAN_RENDER' ],
);

テンプレートエラーメッセージも後から参照したかったりするので、とりあえず$MyApp::FormValidator::Constraint::ErrStr{'CAN_RENDER'} に Xslate が吐くエラーメッセージ突っ込んでおきましたが、相当ダサいのでもうちょっとスマートな方法で実装したいです。

トラックバック - http://d.hatena.ne.jp/Craftworks/20140311/1394495872
リンク元