Blanka を使ってみた

PHP 5.3 がリリースされてそろそろ一年たつし、Symfony2 も ZF2.0 も PHP 5.3 以上なので、そろそろ自宅の環境を PHP 5.3 にせんといかんなーと思ってた。


前から id:anatoo さん作の PHP の次の十年のためのフレームワーク Blanka を試してみたいと思ってたので、重い腰をあげて PHP 5.3 にした*1
インストールは手動でビルドするのは色々めんどくさいので、MacPorts にした。


Blanka を github から clone して、lib 以下を include_path に追加して、examples/01_helloworld/index.php を実行して、正しく実行できるか確認。
テストも付属しているので、test/testall.php を実行し、全てのテストが通るのを確認。


Blanka のドキュメント ではひとつのファイルにコントローラが書かれているが、gist にコントローラクラスを分離できるコードが書いてある。
gist:408470 · GitHub

これを参考に以下のようにディレクトリ構成を作った。

`-- blanka
    |-- app
    |   `-- controllers
    |       `-- IndexController.php
    `-- www
        `-- index.php

※ モデルとビューは今回はなし

www/index.php がドキュメントルートの想定。

<?php
require_once 'Blanka.php';
use blanka\container\ContainerBuilder,
    blanka\Router,
    blanka\ClassLoader;

set_include_path(get_include_path() . PATH_SEPARATOR . dirname(__DIR__));

ClassLoader::registerAsAutoLoader();
$cb = new ContainerBuilder;
$cb->bind('foo')->toValue('bar');
$cb->bind('index.controller')->to('app\controllers\IndexController');
Blanka::app($cb->build())->respond(Router::it()
    ->{'/'}('@index.controller::index')
    ->{'/foo'}('@index.controller::foo')
);

コントローラはこんな感じ。
app/controllers/IndexController.php

<?php
namespace app\controllers;

class IndexController
{
    public function index($params)
    {
        return $params->provide('foo');
    }

    public function foo($params)
    {              
        return 'foo';
    }          
}

http://localhost/ にアクセスすると

bar

http://localhost/index.php/foo にアクセスすると

foo

はまった点

モジュールとしてコントローラクラスを分けた際にオートロードされなくて困った。
Blanka のコードを少し読んだだけなので、他の方法があるかも。

<?php
$cb->bind('index.controller')->to('app\controllers\IndexController');

特にここの 'app\controllers\IndexController' と書いているのがこれでいいのか良くわからなかった。
ディスパッチのルールが良くわからんかった。

<?php
Blanka::app($cb->build())->respond(Router::it()
    ->{'/'}('@index.controller::index')
    ->{'/foo'}('@index.controller::foo')

'@index.controller::index' と書いているから上で書かなくてもいけそうな気がするんだけど。
二つ書くのはめんどくさいと感じるけど、なんか意図があるんだろう。


ともかく面白いフレームワークにはかわらない。
php で Flask みたいなマイクロフレームワーク使いたいというのであれば、id:hiro_y さんの Lune という選択肢もあるかも。
GitHub - hiroy/lune: a PHP minimal framework

*1:個人作の Zend Framework のラッパーも概ねテストは通ったのがバージョンアップを決意した一番大きい動機