Create your own framework... on top of the Symfony2 Componentsを読んだ

2ヶ月前にブックマークした"Create your own framework... on top of the Symfony2 Components"を写経しつつやっと読みました。面白かったです。

フレームワークがどのような問題を解決しようとしているか、という話もありますが、それよりSymfonyやSilexをやっている人が理解を深めるのに良いエントリなのではないでしょうか。

個人的に驚いたのはpart 6のControllerResolverのあたりでした。Requestから呼び出すべきコントローラーとその引数を決定するんですが、仮引数の名前とType Hintを使って、いい感じで引数を渡してくれるようになっています。

$routes->add('leap_year', new Routing\Route('/is_leap_year/{year}', array(
    'year' => null,
    '_controller' => 'LeapYearController::indexAction',
))); 
// このようにルートが定義されていればコントローラ側では
...
    public function indexAction($year) // 動く
    public function indexAction($y) // エラー
    public function indexAction(Request $request, $year) // 動く
    public function indexAction($year, Request $request) // 動く
    public function indexAction(Request $request) {
 		$year = $r->attributes->get('year'); // こう書けば動く
		...

内部ではやはりリフレクションを使っているようですね。
https://github.com/symfony/HttpKernel/blob/master/Controller/ControllerResolver.php

あとComposerは便利ですね。nodeのnpm、RubyのbundlerのPHP版です。今後はスクリプト言語のパッケージ管理はこういう風になっていくんだろうなと思いました。

最後に「もっと知りたければ、Silexの、特にApplicationクラスを読んでみるといいよ」と言われたのでこれから読んでみたいと思います。