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 が吐くエラーメッセージ突っ込んでおきましたが、相当ダサいのでもうちょっとスマートな方法で実装したいです。