読者です 読者をやめる 読者になる 読者になる

PHPの次の十年のためのフレームワークBlankaの話

http://github.com/anatoo/Blanka

タイトルはここからインスパイアされた。
最近PHP5.3で動く新しいウェブアプリケーションフレームワーク作っている。
まだ一度もリリースしていないが以下その概要について箇条書きとサンプルコードを少し書く。

  • PHP5.3以上で動く
  • コントローラ = コールバック
  • コントローラを作るのに必ずしもクラスを書く必要がなく、匿名関数でもよい
  • hello worldのコード
<?php
include_once '/path/to/Blanka.php';

Blanka::app()->respond(function($b) {
    return 'hello world';
});

コントローラの最初の引数には必ずBlankaオブジェクトが渡される。
Blankaオブジェクトは、リクエストを得るためのメソッドや、レスポンスを返すメソッド、他のコントローラを呼び出すためのメソッド、バックトラックするためのメソッドなどを持っている。

  • 単純なコントローラなら匿名関数すら書かなくてもよい。代わりにblanka\basis\_クラスを使う
<?php
// 上のhello worldと同じ
Blanka::app()->respond(_::ok('hello world'));
  • テンプレートエンジンやORMだけでなくディスパッチャも取替可能
<?php
use blanka\Dispatcher;

Blanka::app()->respond(Dispatcher::it()
    ->{'GET /user/{name}'}(function($b, $name) {
        // 処理
    })
    ->{'GET /'}(function($b) {
        // 処理
    })
);

Dispatcher::it()が返すオブジェクトは特別なオブジェクトではなく、単なるコールバックに過ぎない。
PHP5.3では__invokeメソッドを実装したオブジェクトはコールバックとして呼び出すことができる。

  • コントローラ内部で他のコントローラを呼び出したり、バックトラックすることができるので既存のディスパッチャを拡張できたり、別個のディスパッチャを組み合わせることができる
  • アプリケーションの規模に関わらず対応出来るように設計
  • DIコンテナと協調できる
<?php 

Blanka::app(new MyContainer)->respond(Dispatcher::it()
    ->{'GET /user/{name}'}('@page\User')
    ->{'GET /'}('@page\Root')
);

とまあこんな感じで開発している。
上でバックトラックがどうのこうの書かれているが、これはopenpearで公開しているパーサコンビネータから影響を受けている。
バックトラックがあるおかげでディスパッチャが取替可能になったり、簡単に拡張可能になっている。
Blankaについてさらに詳細を知りたい場合はメモを書いているここを参照。