追記
結局言いたいことはcallableの仕組みを用いれば別にslimでcontrollerが使えないなんてことはなかった。ということ。
また、Slim3.0リリースされているので、PHP5.5以上ならこの方法はあまり使ってほしくなかったり。
環境
PHP5.4以上 Slim 2.6.1での検証
経緯
Slimのルーティングは読み書きしやすいけれどどうしても長くなってしまう。
そういうことでControllerを使おうとしたが、こういう記事があって諦めかけていた。
Slim が Class controllers 対応してた
$app->get('/', '\My\Controller\Page:showIndex');
なるほどなるほど。でもこの方式だと静的メソッドかデフォルトコンストラクタ以外で行えそうにはない。
で。
これって単なるcallableってだけじゃ・・・ないかな? と調べたら案の定でした。
slim\Slim\Route.php
//Routeを実際に動かして正常処理したかどうかを返す
public function dispatch()
{
/*略*/
$return = call_user_func_array($this->getCallable(), array_values($this->getParams()));
return ($return === false) ? false : true;
}
ということはis_callable()でtrue返してもらえるなら動く、かも。
slim\Slim\Route.php
/**
* @var mixed The route callable
*/
//というか実質callable|nullっぽい
protected $callable;
//Setterは型チェック + class Controller 実装ぐらい。
public function setCallable($callable)
{
/* (略) */
if (!is_callable($callable)) {
throw new \InvalidArgumentException('Route callable must be callable');
}
$this->callable = $callable;
}
//Getterに至っては一切手を加えない。
public function getCallable()
{
return $this->callable;
}
普通のcallableならばふつーに動く。となればcallableの仕様を調べればあるいは。
答えはcallableであった。
コールバック関数の例
// タイプ 3: オブジェクトメソッドのコール
$obj = new MyClass();
call_user_func(array($obj, 'myCallbackMethod'));
なるほど、array[0]がオブジェクト変数で、array[1]がメソッド名。
これならコンストラクタを定義していても普通に呼び出せますね。
というわけでPHP5.4なら大体のケースはこれでなんとかなるのではと思います。
Application.php
class Application
{
/** @var \PDO */
private $pdo;
/** @var \slim\Slim */
private $app;
/* コンストラクタとか略 */
private function routing() {
$app = $this->app;
$pdo = $this->pdo;
$ctrl = new \test\Models\Controller($app, $pdo);
/* $ctrl->showNotFound() */
$app->notFound([ $ctrl, 'showNotFound' ]);
/* $ctrl->showIndexPage() */
$app->get('/', [ $ctrl, 'showIndexPage' ]);
/* $ctrl->login() */
$app->get('/login', [ $ctrl, 'login' ]);
/* $ctrl->logout() */
$app->get('/logout', [ $ctrl, 'logout' ]);
/* (略) */
}
}
このコードを晒すためだけにQiita初記事を書いてみた。
他の方が参考になれば幸いです。