Hack で JSON返すシンプルなマイクロWebアプリケーションフレームワーク書いてみた
- [追記] PHPカンファレンスのUstのリンク追加
- [追加] Hackの面白そうなところを追記
- [追記] RouterをHackで書きなおした続編はこちら http://d.hatena.ne.jp/brtRiver/20141019/1413738340
久しぶりすぎるブログ更新ですね。。
Hackは、Facebookにより開発されたプログラミング言語である。オープンソースとして公開されており、同社が開発したPHP実行環境のHipHop仮想マシン (HHVM) で動作する
前から気にはなっていましたが書いたことはなかった状態でした。
今年のPHPカンファレンスのust (HHVM + Hack == PHP++)を見ていて、Hack欲が高くなり触ってみないとわからないということで JSONを返すだけのいわゆるマイクロフレームワーク(Haku)を書いてみました。
講演のUst はたぶん11/10ぐらいまでだったら録画からみれると思います。
さて、Hackは既存のPHPコードと混ぜて使うことができるので、ルーティング部分はAura.Router を使うことにし、アプリケーション部分とコントローラー部分をHackで書いてみることに。
https://github.com/brtriver/Haku
いわゆるコントローラー部分は今のところこんな感じに。
<?hh // partial require __DIR__ . '/../vendor/autoload.php'; use Haku\Request; $app = new Haku\Application(); // simple JSON response $app->get('/home', () ==> ['message' => 'this page is home']); // with uri parameter $app->get('/hello/{name}', $name ==> ['message' => $name]); // with condition (Aura.Router) $app->get('/user/{id}', $id ==> ['id' => $id])->addTokens(['id' => '\d+']); // with query parameter $app->get('/search', (Request $r) ==> { if (!$r->query('q')) { http_response_code(400); } return ['q' => $r->query('q')]; }); $app->run((new Request()));
Hackは型があって便利というのが一番注目しがちですが、それ以外にもクロージャがPHPに比べて明らかにシンプルに書けるのでマイクロフレームワークにはぴったりですね。
array_filterも
$routeParams = array_filter($route->params, $param ==> !is_object($param));
みたいに書けますし。
あと、メモ化もアノテーションで簡単。
http://docs.hhvm.com/manual/en/hack.attributes.memoize.php
他にも Map, Set, Pair などの多くのコレクション や イミュータブルなMap もあります。
PHPだとよくありがちな引数を一つの連想配列で渡すようにしたのは良いけど何が入ってるか毎回メソッド側で確認しなくちゃいけないみたいな問題を解決してくれる Shap も便利。
他にもクラスのプロパティもコンストラクタで渡すのであれば定義を書かなくてもよしなにやってくれる コンストラクタ引数プロモーション とか。
ただし現状リファレンスの整備は完全では無いようで、一部リファレンスに書かれていないメソッドなども存在しているみたい。
あと、あまり参考にならないですが、手元のvm環境ではPhalconPHP(nginx+PHP5.6)で書いたコードとHaku(nginx+hhvm)のHello Worldレベルのベンチマークはほぼ同じで十分速いんだろうなぁという感想。
一番の難点は環境作ることですね。。型チェックしてくれるhh_clientを使うためにがんばってソースから入れてました。。
まだHackらしく書くというのが分かってないのであれですが楽しいですね。