コントローラ

BlankaはMVCアーキテクチャパターンを下敷きにして作られたフレームワークである。
このページではBlankaフレームワークでのコントローラについて記す。

コントローラ = コールバック

Blankaフレームワークではコントローラとはコールバックである。コールバックには以下が含まれる。
  • 関数
  • 無名関数
  • __invokeメソッドを実装しているオブジェクト
  • メソッド(オブジェクトとメソッド名が入った配列)
コントローラの実行にはBlanka->invoke()を利用できる。
<?php
Blanka::null()->invoke(function($b) {

    return 'hoge';
}); // 'hoge'が返る

また、通常のコールバックとは別にプロバイダから取り出した値を実行したい場合は以下のよう書ける。
<?php
$b = Blanka::null()->withProvider($my_provider);

// プロバイダから取り出したオブジェクトをコントローラとして実行
$b->invoke('@hoge');
// 下と同様
$b->invoke($b->provide('hoge'));

// プロバイダから取り出したオブジェクトのメソッドをコントローラとして実行
$b->invoke('@hoge::fuga'); // 下と同様
$b->invoke(array($b->provide('hoge'), 'fuga'));

失敗

コントローラを呼び出した際、何らかの値を返すことができずにblanka\basis\Failure例外を投げた場合、そのこ とを「失敗」と呼ぶ。コントローラを失敗させるには通常Blanka->fail()が利用される。
「失敗」は、そのコントローラの呼び出 し側に対して、後続のコントローラを試行するように伝えるために利用される。

引数

コントローラは第一引数に必ずBlankaオブジェクトを取るが、残りの引数についてはコントローラに記述されているパラメータに沿ってフレームワーク側が自動的に用意する。もしそれらの引数をフレームワークが用意できなかった場合はそのコントローラは「失敗」する。
型指定のないパラメータを記述している場合、それと同名の型無し内部パラメータが利用される。型無し内部パラメータはルーティングの際に抽出したいURLの一部を記憶するため等に利用される。
型指定のあるパラメータを記述している場合、それと同型の型付き内部パラメータが利用される。
また、パラメータにデフォルト値があった場合は「失敗」せずにコントローラは呼び出される。

<?php
Blanka::null()->addParam('hoge', 'fuga')->invoke(function($b, $hoge) {
    return $hoge;
}); // 'fuga'が返る

Blanka::null()->addParam('hoge', 'fuga')->invoke(function($b, $hoge, $fuga) {
    return $hoge . $fuga;
}); // 「失敗」する

Blanka::null()->addParam('hoge', 'fuga')->invoke(function($b, $hoge, $fuga = 'fuga') {
    return $hoge . $fuga;
}); // 'fugafuga' が返る

Blanka::null()->addTypedParam('hoge\fuga\Piyo', new hoge\fuga\Piyo)->invoke(function($b, hoge\fuga\Piyo $piyo) {
    return $piyo;
}); // hoge\fuga\Piyoオブジェクトが返る