Ark::View周りの実装の勉強を兼ねて、YAMLとJSONでシリアライズするビュークラスのプロトタイプを書いてみました。
YAML::AnyはOO APIがなく、各YAMLパーサー/リーダー毎のOO APIを個別に呼ぶ吸収はあまりしたくないので、関数APIでいいやという諦めの境地です。
JSON::AnyはOO APIがありますが、useしたスコープで色々まさぐっているので、Ark::View::MTやArk::View::TTのようにMouse属性として持つことを断念しています。またまた諦めの早い私です。
Ark::View::YAMLYAML::Anyを使ってダンプしています。Ark::View::JSONJSON::Anyを使ってダンプしています。Data::Structure::Util::unbless周りの泥臭さがやや気持ち悪いです。SimpleLinks::Web::View::YAMLArk::View::YAMLの定義です。ここでは何もしていません。SimpleLinks::Web::View::JSONArk::View::JSONの定義です。ここでは何もしていません。SimpleLinks::Web::Controller::Root- 使用イメージです。テスト表示処理部分を、Viewモジュールに差し替えています。具体的には、
$c->view('MT')->template('template_name');などとしていたところで$c->forward( $c->view('YAML')->dump($data) );と書いています。
......え、テストはどこかって? ごめんなさい、まだ書いていません(核爆)。テストも書いたらArkの辺境ブランチに混ぜ込んでおきます。
APIは未確定ですし、ほとんど決め打ちの処理でしかないのであくまで私家版モジュールという形ですが、将来的にはArk::View::SerializerなどとしてYAMLとJSONの両方の面倒を見るのも良いかも知れませんね。
なお、blessされたリファレンスがJSONのお口に合わないことを、恥ずかしながら始めて知りました。だからといって上記のようにunblessしてしまうのもどうかと思います。本当に単なるダンプという位置付けでしかないので、例えばWeb APIとして外部に値を渡す際には、ベタなダンプではなくて、きっちり個別のシリアライズ処理を書いた方が良いでしょう。
また、現在はテスト表示のため(ウェブブラウザで表示することを想定して)MIMEタイプをtext/plainとしていますが、Web APIとして使う場合には、text/yamlやらapplication/yamlなどとするのが良さそうです。
コメントする