Slim3.0 RC3 でのメモ。
slim 2.4からroutingでクラス形式のコントローラーを呼び出せるようになっていたらしい などを見て $app
(Slim\Appオブジェクト) の受け渡しができないとキツいなあという感じだったんだけど、そのまま渡したらいけるっぽい(3.0だから?)。
簡単な説明はコード内コメントにて。
index.phpでのSlimルーティング
$app = new \Slim\App(/* ... */);
// any で全てのメソッドに対応し、/sample 以下の全てをコントローラで処理
//
// v3.0 RC3 の時点で、特定ディレクトリ以下の全パスを取得するには
// なぜか {path:.*} という記述でしか動かなかった
// {.*} とか (.*) とかダメ
//
// コンストラクタに $app を渡す必要がある
$app->any('/sample{path:.*}', new SampleController($app));
BaseController.phpの例
<?php
class BaseController
{
protected $app;
final public function __construct($app)
{
// Slim\\Appオブジェクトをセット
$this->app = $app;
}
// ルーティングでの処理
final public function __invoke($request, $response)
{
// リクエストパラメータ
$params = $request->getParams();
// ルーティングのパス( /sample 以下のパス)
$path = $request->getAttribute('route')->getArgument('path');
$path = trim($path, '/');
if (!empty($path)) {
// リクエストメソッドとディレクトリ名を合体しメソッド名にする
// 例:GET /foo -> getFoo()
// 例:POST /foo/bar -> postFooBar()
$func_name = $request->getMethod().str_replace('/', '', $path);
if (method_exists($this, $func_name)) {
return $this->$func_name($params);
}
}
// 該当がなければ Not Found
throw new \Slim\Exception\NotFoundException($request, $response);
}
}
SampleController.php
<?php
class SampleController extends BaseController
{
// GET /sample/foo を処理
public function getFoo($params = array())
{
return $this->app->response->getBody()->write('GETですよ');
}
// POST /sample/foo を処理
public function postFoo($params = array())
{
return $this->app->response->getBody()->write('POSTしたでしょ!');
}
}